废话不多说,直接上效果图和代码:

        

  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 简单封装一个 省市县三级下拉框的更多相关文章

  1. EXCEL设置三级下拉框

    EXCEL设置三级下拉框 1.添加下拉框数据源 公式--->指定 公式--->名称管理器 2.设置第一级下拉框的值 3.第一级下拉框选出一个值 4.设置第二级下拉框(INDIRECT($A ...

  2. 用Ajax遍历三级下拉框

    用Ajax遍历三级下拉框 //通过一级分类的id查二级分类(记得在前端网页按钮绑定点击事件) function getSecondCategory(oneCategoryId){ alert(&quo ...

  3. maven一模块字段调用另一个模块数据生成下拉框

    店铺运营数据录入表实现的下拉框实现 从片区管理中提取分区数据,在招商管理(MIS)模块中获取并以下拉框的形式展现 ctrl类: 1.首先在ctrl类注入需提取另一模块字段的serviceclient接 ...

  4. jquery+html三级联动下拉框

    jquery+html三级联动下拉框及详情页面加载时的select初始化问题   html写的三个下拉框,如下: <select name="ddlQYWZYJ" id=&q ...

  5. jquery+html三级联动下拉框及详情页面加载时的select初始化问题

    html写的三个下拉框,如下: <select name="ddlQYWZYJ" id="ddl_QYWZYJ" class="fieldsel ...

  6. jquery+ligerform三级联动下拉框

    如下为ligerform里的三级联动下拉框: var formData=[ {display:,width:,space:,type:"select",group:"区域 ...

  7. css三级下拉的导航栏

    #menu{ height: 65px; width:100%; background-color: rgba(0, 0, 0, 0.5);}#menu ul{ list-style: none;}# ...

  8. ComboBox可搜索下拉框的使用注意事项,简单记录以及我遇到的一些奇怪的bug

    前几天做一个react的项目的时候需要用一个可搜索的下拉框ComboBox,上代码: <ComboBox // className={comboxClassName} items={storeA ...

  9. MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框

    1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...

随机推荐

  1. 回顾2017系列篇(五):人工智能给UI/UX设计带来的影响

    如今,我们正处于设计新纪年的转折点上,用机器人和人工智能方面的专家说法表达即“The end is near(终点近了)”.但这并不意味着世界末日,但未来机器人将毫无疑问地接管一部分目前被人类占领的工 ...

  2. PBOC中文件结构,文件类型解析

    1.明确两个规范,a. ISO7816   b.EMV规范/PBOC规范,二者的区别,7816是ISO制定的,是国际规范,而EMV规范是卡组织制定的,是遵循ISO7816规范的,PBOC是抄袭EMV规 ...

  3. RollingFileAppender

    http://logback.qos.ch/manual/appenders.html#RollingFileAppender 1.基于时间的滚动策略 TimeBasedRollingPolicy 就 ...

  4. Short jhat tutorial: diagnosing OutOfMemoryError by example

    转自: http://petermodzelewski.blogspot.com/2013/06/short-jhat-tutorial-diagnosing.html jhat这个工具经过使用, 发 ...

  5. 团体程序设计天梯赛L1-025 正整数A+B 2017-03-23 22:47 61人阅读 评论(0) 收藏

    L1-025. 正整数A+B 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题的目标很简单,就是求两个正整数A和B的和,其中 ...

  6. 解决NIOS II工程移动在磁盘上位置后project无法编译问题

    说明:本文档于2017年3月4日由小梅哥更新部分内容,主要是增加了讲解以Quartus II13.0为代表的经典版本和以15.1为代表的更新版本之间,解决问题的一些小的差异. 如果用户只是想快速解决问 ...

  7. 【微服务架构】SpringCloud之Hystrix断路器(六)

    一:什么是Hystrix 在分布式环境中,许多服务依赖项中的一些将不可避免地失败.Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控制这些分布式服务之间的交互.Hystrix通过隔离服务之间 ...

  8. 【微服务架构】SpringCloud之Ribbon(四)

    一:Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接 ...

  9. Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析

    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析 二:linq的分区操作 常用的分区操作:Take,TakeWhile,Skip,SkipWhile 三:Take ...

  10. MVC4 Filter (筛选器)

    Filter,在MVC中我们通常将Filter定义成Attribute特性 来供Controller 或者Action 方法调用. FilterAttribute 是所有Filter 的基类. 而 F ...