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 相关文章推荐
日期函数扩展类Ver0.1.1
Sep 07 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
Apr 27 Javascript
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
js 用CreateElement动态创建标签示例
Nov 20 Javascript
js遍历子节点子元素附属性及方法
Aug 19 Javascript
jquery实现从数组移除指定的值
Jun 24 Javascript
快速学习AngularJs HTTP响应拦截器
Dec 31 Javascript
node.js操作mongodb简单示例分享
May 25 Javascript
详解微信小程序中的页面代码中的模板的封装
Oct 12 Javascript
vue使用xe-utils函数库的具体方法
Mar 06 Javascript
vue input输入框关键字筛选检索列表数据展示
Oct 26 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
Oct 29 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
DOMXML函数笔记
2006/10/09 PHP
PHP面向对象编程快速入门
2006/10/09 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
python中的错误处理
2016/04/10 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
django跳转页面传参的实现
2020/09/17 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
校园报刊亭的创业计划书
2014/01/02 职场文书
运动会拉拉队口号
2014/06/09 职场文书
刑事附带民事代理词
2015/05/25 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
Python实现简繁体转换
2021/06/07 Python
Python多线程 Queue 模块常见用法
2021/07/04 Python