下拉框插件的详解

本插件是基于jQuery实现的

function DropSelect(obj){

  obj = obj || {};
  var p = this;
  p.id = obj.id || ‘selectDrop‘; //这个id为页面上的元素的id,一般为添加下拉框的div元素
  p.data = obj.data || [];

  //传入此下拉框插件的数据是一个数组形式的对象[{text: ‘‘, value: ‘‘},{text: ‘‘, value: ‘‘}],每一项就是下拉框的每一行(每一选项)
  if (p.data && !p.data.length) {    //如果数组选项为0,就把{text: ‘请选择‘, value: ‘‘}加入p.data数组中。下拉框就只会显示请选择
    p.data = $.unique($.merge(p.data, [
      {text: ‘请选择‘, value: ""}
    ]));
  } 
  
  p.selectedValue = obj.selectedValue || 0; //设置默认选中值
  p.width = obj.width; //下拉框的宽度,默认是容器的宽度,也就是添加下拉框的页面上的div元素的宽度。
  p.height = obj.height || 80;
  p.zIndex = obj.zIndex || 200;

  p.widthStr = "width:" + p.width + "px;"; //控件宽度
  p.heightStr = "height:" + (p.height=="auto"?"auto;":(p.height + "px;")); //控件高度
  //处理数据一万条时
  if(p.height == 80 && p.data.length < 4 ){ //当hegiht属性没写时,数据小于4条时,插件就显示几条数据(高度自适应)。
    p.heightStr = "height:auto" ;         
  }else if(p.height == 80&&p.data.length > 3 ){//当hegiht属性没写时,数据大于3条时,插件的高度还是80,其他的,通过滚动条拖动。
    p.heightStr = "height:80px" ;
  }

  //控件相关id的集合
  p.idList = {

    text: "drop_Text_" + p.id, //显示选择项的div的子元素span的id
    ul: "drop_UL_" + p.id,       //下拉框ul的id

    dropSelect: "drop_select_" + p.id,      //显示选择项的div的id
    control: "drp_control" + p.id      //整个插件div的id
  };
  p.itemClick = obj.itemClick || function () {}; //点击触发的回调方法
  p.init();

}

DropSelect.prototype = {
  init: function () {
    var p = this, doc = document;

    $("#" + p.id).append(p._getHTML());   //生成下拉框,添加到页面的div元素中去。
    p.loadEvent();    //绑定事件
  },
  loadEvent: function (obj) {
    var p = this;

  
    
    $("#" + p.idList.dropSelect).click(function () {  //点击显示选择项的标签时
        $("#" + p.idList.control).addClass("open")   //给整个插件的div添加open类,可以在css中设置.open的样式,这样就可以改变整个插件的样式。显示下拉框
    });
  
    //点击下拉框内容中的值
    $("#" + p.idList.ul).click(function (event) {    //事件委托机制
      var target = event.target;
      if (target.nodeName == "A") {
        var val = target.getAttribute("val"),
        text = target.getAttribute("text");

        $("#" + p.idList.text).html(text);    //把选择的值,替换到显示的span中去
        $("#" + p.idList.text).attr("val", val);
        $("#" + p.id).find("[type=‘hidden‘]").val(val);   //修改隐藏的input的值。

        $("#" + p.idList.control).removeClass("open")   //移除open类,隐藏下拉框
        if (p.itemClick) {
          p.itemClick(val, p.data);  //如果有回调方法,就把选择的值,以及整个下拉框的数据传进去。
        }
      }
    });

    //失去焦点隐藏下拉列表框
    $(document).unbind("click", _click).bind("click", _click);   
    function _click(e) {
      var target = $(e.target);
      if (target.closest(".drp_control").length == 0) {

       //下拉框插件的drp_control类,closest方法,从当前元素开始,查找祖先元素,查到一个就结束。父亲->父亲->父亲....,所以如果点击的不是下拉框插件上的元素,就将返回0个jQuery对象
        $("#" + p.idList.control).removeClass("open");
      }
    }

    return;
  },
  getValue: function () {
    return $("#" + this.idList.dropSelect).find("#" + this.idList.text).attr("val");  //得到选择的选项的value值。
  },
  setValue: function (value) {
    var drp_div = $("#" + this.id);
    for (var i = 0; i < this.data.length; i++) {
      var val = this.data[i];

      if (val.value == value) {
        drp_div.find("#" + this.idList.text).html(val.text);
        drp_div.find("#" + this.idList.text).attr("val", val.value);

        drp_div.find("[type=‘hidden‘]").val(value);
      }
    }
  },
  _getHTML: function () {
    var p = this;
    var html = [];

    var isSelectHTML = false;
    var sValue = p.selectedValue;   //默认为0
    var defaultVal = this.data[0].value;//如果传入了数据,就是数据的第一项为默认选项。如果没有传入数据,请选择为默认选项
    var defaultText = this.data[0].text;

    html.push(‘<ul class="fake_slt_menu popList" style="‘ + this.heightStr + (this.width ? "width:" + this.width + "px" : "") + ‘" id="‘ + this.idList.ul + ‘">‘);    //下拉框的宽度和高度设置
    for (var i = 0; i < this.data.length; i++) {

      var val = this.data[i];

      if (val.value == p.selectedValue) {

        //下拉框默认选中的值,如果没有传入数据,那么data中只有一个{text: ‘请选择‘, value: ""},如果传入了数据,就看那个的value等于默认选择的value。
        defaultVal = val.value || "";
        defaultText = val.text || "";
      }
      /* 给下拉框没显示完整的值加鼠标提示 */
      var sTitle = "";
      if(!!val.title){     //有可能text值太长,看不了,用title的形式显示出来
        sTitle = val.title;
      }

      html.push(‘<li id="li_‘ + this.id + ‘_‘ + val.value + ‘"><a href="###" title="‘+sTitle+‘" val="‘ + val.value + ‘" text="‘ + val.text + ‘" ‘ + ‘>‘ + val.text + ‘</a></li>‘)
    }
    html.push("</ul></div>");   //创建完下拉框后,还需要添加一个div来显示下拉框选择的值
    html.push("<input name=\"" + this.id + "\" type=\"hidden\" value=‘" + defaultVal + "‘ />");   //隐藏的input,用来把选择的值,发送给后台。

    html.unshift(‘<div class="fake_slt drp_control" id="‘ + this.idList.control + ‘"><div id="‘ + this.idList.dropSelect + ‘"><span style="height:29px;‘ + (this.width ? "width:" + (this.width - 40) + "px" : "") + ‘" class="fake_slt_txt" id="‘ + this.idList.text + ‘" val="‘ + defaultVal + ‘">‘ + defaultText + ‘</span><a class="fake_slt_a" href="###"><i class="i-bdown"></i></a></div>‘);

    //unshift在数组前面添加字符串。整个的结构就是<div id=this.idList.control><div id=this.idList.dropSelect></div><ul id=this.idList.ul><li></li></ul></div>,this.idList.dropSelect的div是用户选择下拉框的选项后,显示的地方,也就是下拉框默认显示内容的地方。

    return html.join("");
  }
}

你要使用这个插件的话,只要

new DropSelect({
  id: "preferenList",      //页面上div的id
  data: drpData,     //显示的数据,格式为[{text:"",value:"",titile:""},{text:"",value:"",titile:""}]

  height: 120,   //下拉框高度

  width:  80,   //下拉框宽度

  selectedValue :1,   //默认显示的选项

  itemClick :function(){}    //选择选项后,执行的回调方法

});

如果需要把下拉框选择的值,发送给后台,你只要取类型为隐藏的input,并且id为页面div的id的value值。当然也可以使用getValue方法。

加油!

时间: 2024-12-28 21:04:59

下拉框插件的详解的相关文章

query多选下拉框插件 jquery-multiselect(修改)

其实网上关于该控件的使用教程已经很多了,其中 query多选下拉框插件 jquery-multiselect Jquery多选下拉列表插件jquery multiselect功能介绍及使用 这2个的介绍已经比较详细了,尤其是第二个有扩展MyValues函数,只是扩展有些bug,这里我在提出一些我的扩展,我们应该把multiValues属性定义在options里面,让每个multiselect控件都有自己的multiValues属性.我这里还需要一个获取text的方法.有关Myvalues和Myt

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解 标签: Android下拉刷新pullToRefreshListViewGridView 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:[张鸿洋的博客] 群里一哥们今天聊天偶然提到这个git hub上的控件:pull-to-r

jQuery自定义漂亮的下拉框插件8种效果演示

原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示 在线预览 下载地址 实例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <!DOCTYPE html> <html lang="en" class=

Android研究之手PullToRefresh(ListView GridView 下拉刷新)使用详解

 群里一哥们今天聊天偶然提到这个git hub上的控件:pull-to-refresh ,有兴趣的看下,例子中的功能极其强大,支持很多控件.本篇博客详细给大家介绍下ListView和GridView利用pull-to-rerfesh 实现下拉刷新和上拉加载更多.对布局不清楚的可以看Android研究自定义ViewGroup实现FlowLayout 详解. 1.ListView下拉刷新快速入门 pull-to-refresh对ListView进行了封装,叫做:PullToRefreshList

jquery下拉框插件心得

想记录下自己在开发这个下拉框插件之后的心得,发现写一篇博客,真是"知之非艰,行之惟艰".所以再有看到好的文章,就不会再吝啬自己的"赞"了. 多次想该如何写比较好呢?最终决定,将以后我可能用得到的东西一条条记录下来,一条条来写,这样比较清晰. 1.写jquery插件需要的一个结构 // 定义jQuery私有作用域 (function ($) { // 插件默认属性 var defaults = { name1: "value1", name2: &

select下拉框插件jquery.editable-select

项目中有个需求,下拉框既可以下拉选择,也可以手动填写 html代码 1 <span>数据来源</span> 2 <select class="source"> 3 <option value="0">人工导入</option> 4 <option value="1">数据服务平台</option> 5 </select> js代码 1 $('#noMe

自制Jquery下拉框插件

(function ($) { $.fn.select3 = function (option) { var _this = $(this); var isInit = _this.prev('div').hasClass('select3-parent'); if(isInit) return false; var _default = { className: 'select3-parent', //下拉框样式可自定义 width: '300px' }; //默认会根据元素设置的宽度给设置宽

关于下拉框插件、或者框架的下拉框,初始化之后无法联动,或者再次绑定值问题

我用的Bootstrap4的ubold 框架 ,他的下拉框第一次初始化之后,再次初始化,就不在赋值了. 第一步,我审查了元素, 下拉框是没有花里胡哨的样式的,基本上美化下拉框是根据返回的select 数据 生成一个ul li 然后把生成的元素重新赋值. 根据我多次测试和操作,个人分析,造成第二次不绑定数据的原因是:那个初始化方法只会给未生成的元素初始样式,已有的就不会再次初始样式了.(有些框架不会,但是有些会这样) 第二步,根据原因解决(原则上来说,为达目的不择手段) 1.可以把他写的JS找到,

【PullToRefresh 系列一】 Android上拉加载下拉刷新控件详解

转载请注明:http://blog.csdn.net/duguang77/article/details/40921601 作者信息: PullToRefresh控件下载地址:https://github.com/chrisbanes/Android-PullToRefresh 作者:https://github.com/chrisbanes 百度网盘下载地址:http://pan.baidu.com/s/1o6umifw (一)导入方法: 1.下载后将extras,library,sample