码迷,mamicode.com
首页 > 其他好文 > 详细

n级联动下拉菜单组件

时间:2015-07-17 18:43:14      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

这是最近在写的一套前端库中的一个组件,支持n级联动的下拉菜单,在这里跟大家分享一下。

使用方法如下:

<div id="test">
    <p>省份:<select></select></p>
    <p>城市:<select></select></p>
    <p>商家:<select></select></p>
</div>
<script type="text/javascript">
  (function(){
    $("#test").linkage({"山东":{"济南":["济南祥福","济南信达通福"],"青岛":["青岛六和","青岛成浩达"]},"江苏":{"南京":["南京福联","南京长福新港"],"苏州":["苏州豪骏","苏州新佳"]}});
  })();
</script>

linkage函数写为zepto对象的一个方法,参数只有一个,即下拉菜单的数据,为json格式。这里html中select标签需要开发人员手写,是为了联动框的样式可以让开发人员灵活掌控。需要注意的是目标div中select标签数量要与json数据的层数相同。如果结合json生成工具,前端开发人员将会很方便的生成各种复杂的n级联动框。

下面为js代码:

! function($) {
  //构造函数,参数data为json格式数据,参数that为当前的zepto对象
  var Linkage = function(data) {
    this.data = data;
  };
  Linkage.prototype = {
    build: function(that) {
      var _this = this;
      //获取that对象内所有的select对象
      var $select_obj = $(that).find("select");
      //获取that对象内所有的select对象的数量
      var select_num = $select_obj.size();
      //构建第一层select数据
      this._resetSelect($select_obj.eq(0));
      this._renderSelect(this.data, $select_obj.eq(0), 1);
      //逐层绑定change事件
      $select_obj.each(function(index, element) {  
        //如果到了最后一层,则不需要绑定change事件,跳出循环
        if (index + 1 == select_num) {
          return false;
        };
        //绑定change事件
        $(element).change(function() {  
          //清空当前select的所有子层select数据
          for (var i = index + 1; i < select_num; i++) {
            _this._resetSelect($select_obj.eq(i));
          };
          //如果当前层select数据不为空,则填充下一层select数据
          if ($(element).val()) {
            //如果是最后一层type为2,否则type为1
            var type = (index + 2 == select_num) ? 2 : 1;
            //构建下一层data
            var _data = _this.data;
            for (var i = 0; i < index + 1; i++) {
              _data = _data[$select_obj.eq(i).val()];
            };
            _this._renderSelect(_data, $select_obj.eq(index + 1), type);
          };
        });
      });
    },
    //填充select数据
    _renderSelect: function(data, select, type) {
      $.each(data, function(i, n) {
        switch (type) {
          case 1:
            select.append("<option value=‘" + i + "‘>" + i + "</option>");
            break;
          case 2:
            select.append("<option value=‘" + n + "‘>" + n + "</option>");
            break;
          default:
            select.append("<option value=‘" + i + "‘>" + i + "</option>");
        };
      });
    },
    //清空select数据
    _resetSelect: function(select) {
      select.empty();
      select.append("<option value=‘‘></option>");
    }
  };
  function Plugin(data) {
    var linkage = new Linkage(data);
    linkage.build(this);
  };
  $.fn.linkage = Plugin;
}(window.Zepto)

 

n级联动下拉菜单组件

标签:

原文地址:http://www.cnblogs.com/yangjiewu/p/4655130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!