js select实现省市区联动选择


Posted in Javascript onApril 17, 2020

最近整了一一些表单类的移动页面,遇到了一个省市区的联动选择,本来想着用公用库里面的以前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>

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

Javascript 相关文章推荐
Jquery iframe内部出滚动条
Feb 11 Javascript
javascript 得到变量类型的函数
May 19 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
jQuery实现手机版页面翻页效果的简单实例
Oct 05 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
Feb 09 Javascript
JavaScript中splice与slice的区别
May 09 Javascript
详解webpack分包及异步加载套路
Jun 29 Javascript
webstorm中vue语法的支持详解
May 09 Javascript
小程序接入腾讯位置服务的详细流程
Mar 03 Javascript
微信小程序吸底区域适配iPhoneX的实现
Apr 09 Javascript
Node.js 深度调试方法解析
Jul 28 Javascript
javascript实现搜索筛选功能实例代码
Nov 12 Javascript
轻松掌握JavaScript装饰者模式
Aug 27 #Javascript
node.js实现快速截图
Aug 27 #Javascript
购物车前端开发(jQuery和bootstrap3)
Aug 27 #Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 #Javascript
轻松掌握JavaScript享元模式
Aug 27 #Javascript
JavaScript编码风格指南(中文版)
Aug 26 #Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 #Javascript
You might like
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
php操作xml
2013/10/27 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
JS图片定时翻滚效果实现方法
2016/06/21 Javascript
Bootstrap表单布局
2016/07/19 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
简单的三步vuex入门
2018/05/20 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python实现堆栈与队列的方法
2015/01/15 Python
Python实现微信好友的数据分析
2019/12/16 Python
python通过cython加密代码
2020/12/11 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
物流专业大学生求职信范文
2013/10/28 职场文书
十佳班主任事迹材料
2014/01/18 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
2015年护士节慰问信
2015/03/23 职场文书
大队委员竞选稿
2015/11/20 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
倡议书怎么写?
2019/04/11 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
Python Parser的用法
2021/05/12 Python
Redis RDB技术底层原理详解
2021/09/04 Redis
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL