jquery 三级_jQuery三级联动效果代码(省、市、区)

很长时间都不用jquery了,有人问我jquery写三级联动的插件我就写好了发出来吧,正好需要的人都可以看看。

2db5a903f87e88a1a802594ffa26a063.png

一、html代码

<!DOCTYPE html>
<html>
<head>
	<title>三级联动-三人行慕课</title>
	<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
</head>
<body>

<div data-toggle='distpicker' class='form-inline' id='distpicker'>
	<select class="form-control" data-province="---- 选择省 ----"></select>
	<select class="form-control" data-city="---- 选择市 ----"></select>
	<select class="form-control" data-district="---- 选择区 ----"></select>
</div>


<script type="text/javascript" src='js/jquery.min.js'></script>
<script type="text/javascript" src='js/distpicker.data.js'></script>
<script type="text/javascript" src='js/distpicker.js'></script>
<script type="text/javascript">
$("#distpicker").distpicker({
  placeholder: false,
  autoSelect: false
});
</script>


</body>
</html>

二、上面的js引入大家看到了吗,首先引入jquery没什么好说的了,然后引入数据以及插件文件。

distpicker.data.js : 内容是三级联动的数据(数据量特别大,查看地址:https://www.3mooc.com/front/couinfo/978)

distpicker.js : 插件本身代码

/*!
 * Distpicker v1.0.4
 * https://github.com/fengyuanchen/distpicker
 *
 * Copyright (c) 2014-2016 Fengyuan Chen
 * Released under the MIT license
 *
 * Date: 2016-06-01T15:05:52.606Z
 */

(function (factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD. Register as anonymous module.
    define(['jquery', 'ChineseDistricts'], factory);
  } else if (typeof exports === 'object') {
    // Node / CommonJS
    factory(require('jquery'), require('ChineseDistricts'));
  } else {
    // Browser globals.
    factory(jQuery, ChineseDistricts);
  }
})(function ($, ChineseDistricts) {

  'use strict';

  if (typeof ChineseDistricts === 'undefined') {
    throw new Error('The file "distpicker.data.js" must be included first!');
  }

  var NAMESPACE = 'distpicker';
  var EVENT_CHANGE = 'change.' + NAMESPACE;
  var PROVINCE = 'province';
  var CIRY = 'city';
  var DISTRICT = 'district';

  function Distpicker(element, options) {
    this.$element = $(element);
    this.options = $.extend({}, Distpicker.DEFAULTS, $.isPlainObject(options) && options);
    this.placeholders = $.extend({}, Distpicker.DEFAULTS);
    this.active = false;
    this.init();
  }

  Distpicker.prototype = {
    constructor: Distpicker,

    init: function () {
      var options = this.options;
      var $select = this.$element.find('select');
      var length = $select.length;
      var data = {};

      $select.each(function () {
        $.extend(data, $(this).data());
      });

      $.each([PROVINCE, CIRY, DISTRICT], $.proxy(function (i, type) {
        if (data[type]) {
          options[type] = data[type];
          this['$' + type] = $select.filter('[data-' + type + ']');
        } else {
          this['$' + type] = length > i ? $select.eq(i) : null;
        }
      }, this));

      this.bind();

      // Reset all the selects (after event binding)
      this.reset();

      this.active = true;
    },

    bind: function () {
      if (this.$province) {
        this.$province.on(EVENT_CHANGE, (this._changeProvince = $.proxy(function () {
          this.output(CIRY);
          this.output(DISTRICT);
        }, this)));
      }

      if (this.$city) {
        this.$city.on(EVENT_CHANGE, (this._changeCity = $.proxy(function () {
          this.output(DISTRICT);
        }, this)));
      }
    },

    unbind: function () {
      if (this.$province) {
        this.$province.off(EVENT_CHANGE, this._changeProvince);
      }

      if (this.$city) {
        this.$city.off(EVENT_CHANGE, this._changeCity);
      }
    },

    output: function (type) {
      var options = this.options;
      var placeholders = this.placeholders;
      var $select = this['$' + type];
      var districts = {};
      var data = [];
      var code;
      var matched;
      var value;

      if (!$select || !$select.length) {
        return;
      }

      value = options[type];

      code = (
        type === PROVINCE ? 86 :
        type === CIRY ? this.$province && this.$province.find(':selected').data('code') :
        type === DISTRICT ? this.$city && this.$city.find(':selected').data('code') : code
      );

      districts = $.isNumeric(code) ? ChineseDistricts[code] : null;

      if ($.isPlainObject(districts)) {
        $.each(districts, function (code, address) {
          var selected = address === value;

          if (selected) {
            matched = true;
          }

          data.push({
            code: code,
            address: address,
            selected: selected
          });
        });
      }

      if (!matched) {
        if (data.length && (options.autoSelect || options.autoselect)) {
          data[0].selected = true;
        }

        // Save the unmatched value as a placeholder at the first output
        if (!this.active && value) {
          placeholders[type] = value;
        }
      }

      // Add placeholder option
      if (options.placeholder) {
        data.unshift({
          code: '',
          address: placeholders[type],
          selected: false
        });
      }

      $select.html(this.getList(data));
    },

    getList: function (data) {
      var list = [];

      $.each(data, function (i, n) {
        list.push(
          '<option' +
          ' value="' + (n.address && n.code ? n.address : '') + '"' +
          ' data-code="' + (n.code || '') + '"' +
          (n.selected ? ' selected' : '') +
          '>' +
            (n.address || '') +
          '</option>'
        );
      });

      return list.join('');
    },

    reset: function (deep) {
      if (!deep) {
        this.output(PROVINCE);
        this.output(CIRY);
        this.output(DISTRICT);
      } else if (this.$province) {
        this.$province.find(':first').prop('selected', true).trigger(EVENT_CHANGE);
      }
    },

    destroy: function () {
      this.unbind();
      this.$element.removeData(NAMESPACE);
    }
  };

  Distpicker.DEFAULTS = {
    autoSelect: true,
    placeholder: true,
    province: '—— 省 ——',
    city: '—— 市 ——',
    district: '—— 区 ——'
  };

  Distpicker.setDefaults = function (options) {
    $.extend(Distpicker.DEFAULTS, options);
  };

  // Save the other distpicker
  Distpicker.other = $.fn.distpicker;

  // Register as jQuery plugin
  $.fn.distpicker = function (option) {
    var args = [].slice.call(arguments, 1);

    return this.each(function () {
      var $this = $(this);
      var data = $this.data(NAMESPACE);
      var options;
      var fn;

      if (!data) {
        if (/destroy/.test(option)) {
          return;
        }

        options = $.extend({}, $this.data(), $.isPlainObject(option) && option);
        $this.data(NAMESPACE, (data = new Distpicker(this, options)));
      }

      if (typeof option === 'string' && $.isFunction(fn = data[option])) {
        fn.apply(data, args);
      }
    });
  };

  $.fn.distpicker.Constructor = Distpicker;
  $.fn.distpicker.setDefaults = Distpicker.setDefaults;

  // No conflict
  $.fn.distpicker.noConflict = function () {
    $.fn.distpicker = Distpicker.other;
    return this;
  };

  $(function () {
    $('[data-toggle="distpicker"]').distpicker();
  });
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery三级联动是一种常见的前端开发技术,它可以实现在一个页面上选择三个级别的地址。通常情况下,三级联动需要一个包含的数据源,通过前端JavaScript和jQuery库来实现。 jQuery三级联动的实现一般步骤如下: 1. 页面布局:需要在页面上添加三个下拉框,分别用于选择/县。 2. 数据源:需要准备一个包含/县数据的数组或者JSON对象,通常可以使用jQuery的ajax方法从后端获取数据源。 3. 事件绑定:需要为/县三个下拉框绑定change事件,以响应用户选择事件。 4. 数据筛选:在/县三个下拉框中任意一个选项改变时,需要通过当前选择的值来筛选出下一级的选项,并更新对应的下拉框。 5. 默认值设置:需要为每个下拉框设置默认值,在页面加载时自动显示。 以下是示例代码: HTML部分: ``` <label>份:</label> <select id="province"></select> <label>城:</label> <select id="city"></select> <label>/县:</label> <select id="district"></select> ``` JavaScript部分: ``` $(function() { // 获取份列表 $.ajax({ url: '/api/province', dataType: 'json', success: function(data) { // 将份列表添加到下拉框中 $.each(data, function(index, item) { $('#province').append('<option value="' + item.id + '">' + item.name + '</option>'); }); } }); // 当份改变时,更新城列表 $('#province').on('change', function() { var provinceId = $(this).val(); $.ajax({ url: '/api/city', dataType: 'json', data: { provinceId: provinceId }, success: function(data) { // 清空城列表 $('#city').empty(); // 将城列表添加到下拉框中 $.each(data, function(index, item) { $('#city').append('<option value="' + item.id + '">' + item.name + '</option>'); }); // 触发城改变事件 $('#city').trigger('change'); } }); }); // 当城改变时,更新/县列表 $('#city').on('change', function() { var cityId = $(this).val(); $.ajax({ url: '/api/district', dataType: 'json', data: { cityId: cityId }, success: function(data) { // 清空/县列表 $('#district').empty(); // 将/县列表添加到下拉框中 $.each(data, function(index, item) { $('#district').append('<option value="' + item.id + '">' + item.name + '</option>'); }); } }); }); // 页面加载时触发份改变事件,自动显示默认值 $('#province').trigger('change'); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值