n级联动下拉菜单组件

这是最近在写的一套前端库中的一个组件,支持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)
时间: 2024-11-05 06:08:54

n级联动下拉菜单组件的相关文章

(实用篇)jQuery+PHP+MySQL实现二级联动下拉菜单

二级联动下拉菜单选择应用在在很多地方,比如说省市下拉联动,商品大小类下拉选择联动.本文将通过实例讲解使用jQuery+PHP+MySQL来实现大小分类二级下拉联动效果. 先看下效果 大类:  前端技术   程序开发   数据库   小类: 实现的效果就是当选择大类时,小类下拉框里的选项内容也随着改变.实现原理:根据大类的值,通过jQuery把值传给后台PHP处理,PHP通过查询MySQl数据库,得到相应的小类,并返回JSON数据给前端处理. XHTML 首先我们要建立两个下拉选择框,第一个是大类

jQuery cxSelect 多级联动下拉菜单

随着电商热门,这种多层次的互动更充分地体现在下拉菜单,最明显的是多级联动地址下拉选择,因此,这里是一个简单的分享 jQuery cxSelect 多级联动下拉菜单 cxSelect 它是基于 jQuery 多级联动菜单插件.它适用于各省.动菜单. 列表数据通过 AJAX 获取(须要在server环境执行),也能够使用变量自己定义,数据内容使用 JSON 格式. 提供国内省市县数据(数据来源:basecss/cityData Date: 2014.03.31) 个人一直都有习惯,当有新知识点须要学

联动下拉菜单

<!doctype html><html><head><meta charset="utf-8"><title>联动下拉菜单</title><script>window.onload = function(){    var s1 = new Sel('div1');    s1.add('0',['1','2','3']);        s1.add('0_0',['1_1','1_2','1_3'

InfoPath与SharePoint之(三) 在InfoPath中实现联动下拉菜单

在InfoPath中实现联动的下拉菜单是一种比较常见的需求.这里通过演示如何选择省份和城市,讲解一下如何实现联动下拉菜单. 首先在上一篇博客里建的Area List,再加一个City的column,类型就是Single Line of Text. 在上一篇的博客中创建的下拉菜单旁边,再添加一个,用来显示城市.这个时候两个下拉菜单是没有关联的,而且显示的都是全部的item. 为了方便区分,去把两个Drop-Down List改了名词,分别是Province 和City. 首先我们要去除掉省份的重复

省市联动下拉菜单的实现

  省市联动下拉菜单的实现一.数据库的建立为了更好的实现与数据库连接,省表中需要有两个元素,一个是省编号,一个是省名称:市表中需要有三个元素,一个是市编号,一个是市名称,更重要的是这个市改隶属于那个省.省表(UserProvince)ProID    ProName1            河南2            安徽市表(UserCity)CityID    ProID    CityName1              1         郑州2              2     

省市区县街道四级联动下拉菜单

参考代码: JQuery中国省市区街道三级.四级联动下拉菜单插件 (将代码中单纯的四级联动提取出来,对其中的bug进行了修正,并完善了一些不完美的地方) 先通过最终效果看一下功能: 代码如下: index.html:(注:请将代码中的jquery.min.js替换成你本地的jquery地址) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>jQuery四级

ajax三级联动下拉菜单

ajax写三级联动,先写一个文件类吧,以后用的时候直接调用即可: 来找一张表: 实现: 中国地域的三级联动:省.市.区: 图: 说一下思路: (1)当用户选择省份的时候触发事件,把当前的省份的id通过ajax发出请求传递到服务端的程序中 (2)比如取中国地域,中国是0001,那么自带号为0001的便是中国地域: 北京的代号为11,那么子代号为11的便是北京时的市区, 也就是说根据主代号查询子代号: (3)服务端根据客户端的请求,查询数据库,并按照一定的格式返回给客户端 显示页面非常简单,只需要一

ajax实现三级联动下拉菜单

先不要着急去实现功能,我们第一步首先要理清思路,想要实现三级联动,首先要有三个下拉框,然后点击第一个下拉菜单,可以联动到第二个,点击第二个联动到第三个,实现省市区的三级联动,用到的数据表如下: 为了以后可以随时拿出来用,我们先在主页面建立一个div叫sanji,然后用一个js页面来引用: 主页面引入Jquery和js: <title>无标题文档</title> <script src="jquery-3.2.0.min.js"></script

使用vue来开发一个下拉菜单组件(1)

一.新建demo工程 vue init webpack-simple demo 添加src/mixins/emitter.js文件(见前几篇博文) 安装font-awesome字体库: cnpm install font-awesome --save 配置webpack.config.js,引入字体文件: { test: /\.(otf|eot|ttf|woff|woff2)$/, loader: 'file-loader' } 在src/main.js中引入font-awesome: impo