js select实现省市区联动选择

最近整了一一些表单类的移动页面,遇到了一个省市区的联动选择,本来想着用公用库里面的以前pc端的省市区选择组件,但是发现pc端的效果在手机端用效果太不理想,设计没给出具体的设计效果,只好自己整了select原生的省市区选择效果,样式使用手机自带的效果,感觉样式效果凑合还能用,数据还是用的pc的数据,只是把组件的给重写了一下,代码效果如下:

var $ = require('jquery'),
  $window = $(window),
  data = require('./data-new'),
  $doc = $(document);

var __DEFAULTS__ = {
  wrap:'',
  itemName: ['省', '市', '区/县'],
  items: ['province', 'city', 'area'],
  callback: function(field, index) {} // 点击切换得时候才会执行

};

 function Area(options){
   options = $.extend({}, __DEFAULTS__, options);
   var that = this;
   that.wrapper = $(options.wrap);
   that.selectArr = that.wrapper.data('default')?that.wrapper.data('default').split(','):[110000,110100,110101]; //
   that.items = options.items;
   that.itemName = options.itemName;
   that.callback = options.callback;
   that.setValue();
   that.events();
   that.default = that.wrapper.data('default'); //默认输出省市区的id
   that.validinput = $("#default-area");
   var validval = that.default!==undefined?that.default:'';
   that.validinput.val(validval);

 }

Area.prototype = {
  constructor: Area,
  //创建select,输出相应的数据
  createItems:function(itemname,data,selectId){
    var that = this;
    //如果默认的defalut值没输出,则默认的给select添加相应的填写提示
    var html = '<select name="'+itemname+'">'+(that.default === undefined ?'<option value="'+itemname+'" selected ="selected">'+that.itemName[that.index]+'</option> ' : '');

    for (var k in data) {

      html += '<option value ="'+ data[k].id +'"'+(selectId === data[k].id ? 'selected = "selected"' : '')+'>' + data[k].name + '</option>';

    }
    html += '</select>';
    return html;
  },
  //设置初始值
  setValue:function(){
    var that = this,
      html = '';

    $.each(that.selectArr,function(index,k){
      that.index = index;
       html += that.createItems(that.items[index],that.getData(that.items[index],that.selectArr[index-1]),k);

    })
    that.wrapper.append(html)

  },
  //获取数据
  getData: function(type, pid) {

    if (type === 'province') {
      return data.provinces || [];  // 省份信息不需要pid
    }

    if (type === 'city') {
      return data.cities[pid] || [];
    }

    if (type === 'area') {
      return data.areas[pid] || [];
    }
  },
   //获取select索引值
  getItemIndex:function(type){
    var that = this;
    for(var i= 0,l = that.items.length;i<l;i++){
      if(that.items[i] == type){
        return i;
      }
    }

  },
  //触发change时候,select下一位值重新初始化
  setItemVal:function(select){

    var that = this;
    var $this = select,
      previd = $this.val(),
      $type =$this.attr('name'),
      $nxtType = '';

    if($type!='area'){

      $nxtType = that.items[that.getItemIndex($type)+1];

      var data = that.getData($nxtType,previd),
        html = that.createItems($nxtType,data,previd),
        nextSelect = $('select[name="'+$nxtType+'"]');

      if($this.siblings('select[name="'+$nxtType+'"]').length>0){
        nextSelect.remove();
      }
      $this.after(html);
      nextSelect.find('option:first').prop('selected',true);
      $('select[name="'+$nxtType+'"]').trigger('change');
    } else{

      that.validinput.val($this.val()).trigger('validate')
    }
    that.index = that.getItemIndex($type);
    //触发change后可以设置回调函数
    if (that.callback) {
      that.callback.call(this, select, that.getItemIndex($type));
    }

  },
  events:function(){
    var that = this;
    //select change事件
    $doc.on('change','.area-container select',function(){
      that.setItemVal($(this));

    })
  }
}

module.exports = Area;

html代码:

代码如下:

<input type="hidden" name="defaultArea" value="" id="default-area" >  //必填项,为了添加验证触发验证用
<div class="area-container" data-default=""></div>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • javascript Select标记中options操作方法集合

    javascript操作Select标记中options集合 先来看看options集合的这几个方法: options.add(option)方法向集合里添加一项option对象: options.remove(index)方法移除options集合中的指定项: options(index)或options.item(index)可以通过索引获取options集合的指定项: javascript代码如下: var selectTag = null; //select标记 var OPTONLEN

  • js实现一个省市区三级联动选择框代码分享

    运行效果:  ================================================= 部分代码: ================================================= 当然首先你数据库中要有这个table,不然你没有数据.....^_^ 复制代码 代码如下: <tr> <td class="tr pr10 "> 所在地: </td> <td class="tl">

  • 基于javascript bootstrap实现生日日期联动选择

    本文实例为大家分享了js实现日期联动选择的相关代码,适用于生日的选择,供大家参考,具体内容如下 实现目标:年月日三个select 输入框,以及一个hidden的input,通过js获取input的值,如果有值切是日期格式,年月日select为input中的时间.否则为空.年默认区间段为1900年到当今年份 本人使用了bootstrap,class请参照bootstrap的相关说明 下面是html 内容: <div class="col-sm-9"> <label cl

  • jquery及原生js获取select下拉框选中的值示例

    现在有一id=test的下拉框,怎么拿到选中的那个值呢? 分别使用javascript原生的方法和jquery方法 复制代码 代码如下: <select id="test" name=""> <option value="1">text1</option> <option value="2">text2</option> </select> 一:javas

  • Js操作Select大全(取值、设置选中等等)

    jquery操作select(取值,设置选中) 每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select> 1.设置value为pxx的项选中 $(".selector").val("pxx"); 2.设置text为pxx的项选中 $(".selector").find("option[tex

  • JS简单实现城市二级联动选择插件的方法

    本文实例讲述了JS简单实现城市二级联动选择插件的方法.分享给大家供大家参考.具体如下: js实现的城市联动选择菜单,网上经常见到,不多介绍了,本款城市选择菜单原型基于Select,主要使用JavaScript来实现,运用了数组和循环等基础技巧制作完成的.本效果只是为了演示如何实现,里面的数据不全,需要的自己可以添加. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-ejld-city-cha-plug-codes/ 具体代码如下: <htm

  • javascript 日期联动选择器 [其中的一些代码值得学习]

    DateSelector body { margin: 0px; padding: 0px; font-size: 12px; } #year, #month, #date{ width: 60px; margin-right: 3px; } var $ = function(id) { return 'string' == typeof id ? document.getElementById(id) : id; }; var Extend = function(destination, so

  • JSON+HTML实现国家省市联动选择效果

    复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>json</title> <script type="text/javascript"> <!-- v

  • js 触发select onchange事件代码

    select 或text的onchange事件需要手动(通过键盘输入)改变select或text的值才能触发,如果在js中给select或text赋值,则无法触发onchang事件, 例如,在页面加载完成以后,需要触发一个onChange事件,在js中用document.getElementById("province").value="湖北";直接给select或text赋值是不行的,要想实现手动触发onchange事件,需要在js给select赋值后,加入下面的

  • javascript操作select参考代码

    1.判断select选项中 是否存在Value="paraValue"的Item         function jsSelectIsExitItem(objSelect, objItemValue) {             var isExit = false;             for (var i = 0; i < objSelect.options.length; i++) {                 if (objSelect.options[i].

随机推荐