js select实现省市区联动选择

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

rush:js;"> 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]+' ' : '');

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,nextSelect = $('select[name="'+$nxtType+'"]');

  if($this.siblings('select[name="'+$nxtType+'"]').length>0){
    nextSelect.remove();
  }
  $this.after(html);
  nextSelect.find('option:f<a href="https://www.jb51.cc/tag/irs/" target="_blank" class="keywords">irs</a>t').prop('selected',true);
  $('select[name="'+$nxtType+'"]').trigger('change');
} else{

  that.validinput.val($this.val()).trigger('validate')
}
that.index = that.getItemIndex($type);
//触发change后可以设置回调<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>
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代码

代码如下:
//必填项,为了添加验证触发验证用

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...