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之二(两种扩展)
Jun 11 Javascript
JQuery动画和停止动画实例代码
Mar 01 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
使用JavaScript开发跨平台的桌面应用详解
Jul 27 Javascript
从零开始最小实现react服务器渲染详解
Jan 26 Javascript
vue.js 实现点击按钮动态添加li的方法
Sep 07 Javascript
手写Vue弹窗Modal的实现代码
Sep 11 Javascript
Vue 一键清空表单的实现方法
Feb 07 Javascript
js实现时钟定时器
Mar 26 Javascript
Node.js API详解之 readline模块用法详解
May 22 Javascript
openLayer4实现动态改变标注图标
Aug 17 Javascript
解决VueCil代理本地proxytable无效报错404的问题
Nov 07 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
ADODB的数据库封包程序库
2006/12/31 PHP
PHP多个文件上传到服务器实例
2014/10/29 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
js控制table合并具体实现
2014/02/20 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
详解python 注释、变量、类型
2018/08/10 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
Python配置文件处理的方法教程
2019/08/29 Python
python里反向传播算法详解
2020/11/22 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
网络教育自我鉴定
2014/02/04 职场文书
继承公证书
2014/04/09 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS