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 相关文章推荐
比较详细的javascript对象的property和prototype是什么一种关系
Aug 06 Javascript
Jquery中dialog属性小记
Sep 03 Javascript
javascript学习笔记(一) 在html中使用javascript
Jun 18 Javascript
js 赋值包含单引号双引号问题的解决方法
Feb 26 Javascript
JavaScript的类型、值和变量小结
Jul 09 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
Dec 10 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
Feb 22 Javascript
Angular2监听页面大小变化的解决方法
Oct 09 Javascript
vue 自定义指令自动获取文本框焦点的方法
Aug 25 Javascript
JS面试题大坑之隐式类型转换实例代码
Oct 14 Javascript
Vue使用NPM方式搭建项目
Oct 25 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
Apr 25 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
js实现日历与定时器
2017/02/22 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
Python连接mysql数据库的正确姿势
2016/02/03 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
艺术用品:Arteza
2018/11/25 全球购物
学生党员思想汇报
2013/12/28 职场文书
廉洁校园实施方案
2014/05/25 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
redis protocol通信协议及使用详解
2022/07/15 Redis