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 相关文章推荐
JS小功能(onmouseover实现选择月份)实例代码
Nov 28 Javascript
Javascript保存网页为图片借助于html2canvas库实现
Sep 05 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
Sep 21 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
vue router路由嵌套不显示问题的解决方法
Jun 17 Javascript
vue-cli项目代理proxyTable配置exclude的方法
Sep 20 Javascript
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
微信小程序 swiper 组件遇到的问题及解决方法
May 26 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
Mar 10 Javascript
微信小程序实现打卡签到页面
Sep 21 Javascript
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
轻松掌握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短域名转换为实际域名函数
2011/01/17 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
JQuery优缺点分析说明
2011/04/10 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
浅谈python之新式类
2018/08/12 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
司机的工作范围及职责
2013/11/13 职场文书
毕业生就业推荐信范文
2013/12/01 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
企业承诺书格式
2014/05/21 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android