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 元素控制(追加元素/追加内容)介绍及应用
Apr 21 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
May 07 Javascript
js showModalDialog弹出窗口实例详解
Jan 07 Javascript
从零学JSON之JSON数据结构
May 19 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
Jul 18 Javascript
表单元素值获取方式js及java方式的简单实例
Oct 15 Javascript
微信小程序教程系列之视图层的条件渲染(10)
Apr 19 Javascript
webpack配置打包后图片路径出错的解决
Apr 26 Javascript
js实现可爱的气泡特效
Sep 05 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
Sep 21 Javascript
jQuery+ajax实现文件上传功能
Dec 22 jQuery
JS前端canvas交互实现拖拽旋转及缩放示例
Aug 05 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学习笔记之三 数据库基本操作
2011/01/17 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
pandas string转dataframe的方法
2018/04/11 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
python五子棋游戏的设计与实现
2019/06/18 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
解决Python中回文数和质数的问题
2019/11/24 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
最新大学生自我评价
2013/09/24 职场文书
公司年会演讲稿范文
2014/01/11 职场文书
初三学习计划书范文
2014/04/30 职场文书
初三毕业评语
2014/12/26 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书