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 源码分析笔记(3) Deferred机制
Jun 19 Javascript
jquery验证表单中的单选与多选实例
Aug 18 Javascript
php中给js数组赋值方法
Mar 10 Javascript
jQuery的ready方法详解
Nov 27 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
Dec 18 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
Mar 14 Javascript
深入理解Vue router的部分高级用法
Aug 15 Javascript
React+TypeScript+webpack4多入口配置详解
Aug 08 Javascript
JavaScript设计模型Iterator实例解析
Jan 22 Javascript
js代码编写无缝轮播图
Sep 13 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 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中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
img标签中onerror用法
2009/08/13 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Python匿名函数及应用示例
2019/04/09 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
python numpy存取文件的方式
2020/04/01 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
十佳党员事迹材料
2014/08/28 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
社区好人好事材料
2014/12/26 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
六一活动主持词
2015/06/30 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
gojs实现蚂蚁线动画效果
2022/02/18 Javascript