es6 简单封装一个 省市县三级下拉框
废话不多说,直接上效果图和代码:

1,index.js
function $(el){
return document.getElementById(el)
}
let render = Symbol('render')
let event = Symbol('event')
class Select {
constructor (el) {
console.log(el)
if (!el) {
throw '请填写el配置'
} else {
this[render](el)
this[event]()
}
}
[render](el) {
let tpl = `<div class="select-box disIn font14">
<div class="province-box disIn pr">
<input type="text" name="province" class="province-input" id="province-input" placeholder="请选择省" readonly>
<ul class="province-list" id="province-list"></ul>
</div>
<div class="city-box disIn pr">
<input type="text" name="city" class="city-input" id="city-input" placeholder="请选择市" readonly>
<ul class="city-list" id="city-list"></ul>
</div>
<div class="area-box disIn pr">
<input type="text" name="area" class="area-input" id="area-input" placeholder="请选择县" readonly>
<ul class="area-list" id="area-list"></ul>
</div>
</div>`;
el.innerHTML = tpl;
}
async [event]() {
let datas = await fetchJson('/region') // 这里用了mock 模拟了一个get请求,获取了一个全国省市县的json数据。
let $provinceInput = $('province-input')
let $provinceList = $('province-list')
let $cityInput = $('city-input')
let $cityList = $('city-list')
let $areaInput = $('area-input')
let $areaList = $('area-list')
let provinceData = '';
let cityData = '';
let areaData = '';
let choicedData = null;
$provinceInput.onclick = function () {
provinceData = '';
for (let province of datas.data) {
provinceData += `<li data-code="${province.code}">${province.name}</li>`
}
$provinceList.innerHTML = provinceData
$provinceList.style.display = 'block'
$provinceList.onclick = function (e) {
$provinceInput.value = e.target.innerHTML
$provinceInput.setAttribute('data-code', e.target.getAttribute('data-code'))
$cityInput.value = $areaInput.value = '';
this.style.display = 'none';
}
}
$cityInput.onclick = function () {
cityData = '';
let provinceCode = $provinceInput.getAttribute('data-code')
if (!provinceCode) {
$provinceInput.click()
return
}
choicedData = datas.data.filter(item => {
return item.code === provinceCode
})
for (let item of choicedData[].cityList) {
cityData += `<li data-code="${item.code}">${item.name}</li>`
}
$cityList.innerHTML = cityData
$cityList.style.display = 'block';
$cityList.onclick = function (e) {
$cityInput.value = e.target.innerHTML
$cityInput.setAttribute('data-code', e.target.getAttribute('data-code'))
this.style.display = 'none'
}
}
$areaInput.onclick = function () {
areaData = '';
let cityCode = $cityInput.getAttribute('data-code');
if (!cityCode) {
$cityInput.click()
return
}
let cityChoiced = choicedData[].cityList.filter(item => {
return item.code === cityCode
})
for (let item of cityChoiced[].areaList) {
areaData += `<li data-code="${item.code}">${item.name}</li>`
}
$areaList.innerHTML = areaData;
$areaList.style.display = 'block'
$areaList.onclick = function (e) {
$areaInput.value = e.target.innerHTML
$areaInput.setAttribute('data-code', e.target.getAttribute('data-code'))
this.style.display = 'none'
}
}
}
}
es6 简单封装一个 省市县三级下拉框的更多相关文章
- EXCEL设置三级下拉框
EXCEL设置三级下拉框 1.添加下拉框数据源 公式--->指定 公式--->名称管理器 2.设置第一级下拉框的值 3.第一级下拉框选出一个值 4.设置第二级下拉框(INDIRECT($A ...
- 用Ajax遍历三级下拉框
用Ajax遍历三级下拉框 //通过一级分类的id查二级分类(记得在前端网页按钮绑定点击事件) function getSecondCategory(oneCategoryId){ alert(&quo ...
- maven一模块字段调用另一个模块数据生成下拉框
店铺运营数据录入表实现的下拉框实现 从片区管理中提取分区数据,在招商管理(MIS)模块中获取并以下拉框的形式展现 ctrl类: 1.首先在ctrl类注入需提取另一模块字段的serviceclient接 ...
- jquery+html三级联动下拉框
jquery+html三级联动下拉框及详情页面加载时的select初始化问题 html写的三个下拉框,如下: <select name="ddlQYWZYJ" id=&q ...
- jquery+html三级联动下拉框及详情页面加载时的select初始化问题
html写的三个下拉框,如下: <select name="ddlQYWZYJ" id="ddl_QYWZYJ" class="fieldsel ...
- jquery+ligerform三级联动下拉框
如下为ligerform里的三级联动下拉框: var formData=[ {display:,width:,space:,type:"select",group:"区域 ...
- css三级下拉的导航栏
#menu{ height: 65px; width:100%; background-color: rgba(0, 0, 0, 0.5);}#menu ul{ list-style: none;}# ...
- ComboBox可搜索下拉框的使用注意事项,简单记录以及我遇到的一些奇怪的bug
前几天做一个react的项目的时候需要用一个可搜索的下拉框ComboBox,上代码: <ComboBox // className={comboxClassName} items={storeA ...
- MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框
1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...
随机推荐
- Greeplum 系列(四) 数据的装载与卸裁
Greeplum 系列(四) 数据的装载与卸裁 装载数据有以下种方法: insert copy 外部表 gpload 下面以 member_delta 表为例分别介绍这四种方法. create tab ...
- mysql问题,出现 Cant connect to mysql server on 'localhost'
莫名其妙的一个问题,这个问题出现在今天,然后查找下,发现需要重启服务器,但是重启也一样,于是关机重启,还是这个现象 ,然后看到 错误提示, 提示my.ini的第21行,产生错误,于是按照路径找到配置文 ...
- 云存储上传控件(cloud2)-Xproer.HttpUploader7
版权所有 2009-2016 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/cloud2/ ...
- STS 闪退
# # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ILLEGAL_INSTRUCTI ...
- HBase-0.98.0和Phoenix-4.0.0分布式安装指南
目录 目录 1 1. 前言 1 2. 约定 2 3. 相关端口 2 4. 下载HBase 2 5. 安装步骤 2 5.1. 修改conf/regionservers 2 5.2. 修改conf/hba ...
- ASP.NET MVC WebApi接口授权验证
对于很任何多开发者来说,不管是使用任何一种框架,或者是使用任何一种语言,都要使用面向接口编程.使用面向接口编程的时候,那么就会有很多的权限验证,用户验证等等. 特别是对于一些系统来说,别人想要对接你的 ...
- JavaScript语言精粹 笔记04 数组
数组1 数组字面量2 长度3 删除4 列举5 混淆的地方6 方法7 维度 数组1 数组字面量 var empty = []; var numbers = [ 'zero', 'one', 'two', ...
- JVM 方法调用之解析
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还没有涉及到方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍最频繁的操作,但Class文件 ...
- nginx中级应用-续
1.server下配置的每个location,都需要有自己的一套代理配置 即要么加入: root 某个目录 要么加入 proxy_pass 某个地址; proxy_redirect off; # ...
- Java的StringTokenizer类
StringTokenizer是java中object类的一个子类,继承自 Enumeration接口.此类允许一个应用程序进入一个令牌(tokens),而且StringTokenizer类用起来比S ...