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 相关文章推荐
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
jquery实现下拉框多选方法介绍
Jan 03 Javascript
bootstrap表单示例代码分享
May 18 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
vue 国际化 vue-i18n 双语言 语言包
Jun 07 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
Sep 03 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
node.js使用stream模块实现自定义流示例
Feb 13 Javascript
Javascript ParentNode和ChildNode接口原理解析
Mar 16 Javascript
javascript实现京东快递单号的查询效果
Nov 30 Javascript
如何通过简单的代码描述Angular父组件、子组件传值
Apr 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
php读取msn上的用户信息类
2008/12/05 PHP
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
python查看FTP是否能连接成功的方法
2015/07/30 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
详解Python yaml模块
2020/09/23 Python
Python内置函数及功能简介汇总
2020/10/13 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
班组安全员工作职责
2014/02/01 职场文书
会走路的树教学反思
2014/02/20 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
辩护意见书
2015/06/04 职场文书
2016银行招聘自荐信
2016/01/28 职场文书