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

        

  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. Spring查询方法的注入 为查询的方法注入某个实例

    //这里是客户端的代码 当调用CreatePersonDao这个抽象方法或者虚方法的时候由配置文件返回指定的实例 为查询的方法注入某个实例 start static void Main(string[ ...

  2. maven 执行本地、服务器 jar包安装

    开发时遇到过第三方jar包依赖不了时的尴尬 因为遇到过几次所以记录一下,POM文件引入的个推jar包无效,就必须本地安装了,服务器上的也是一样,执行相同的maven命令就行,注意修改路径!和将jar包 ...

  3. spring 获取 WebApplicationContext的几种方法

    spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...

  4. hdu Lovekey(水题)

    #include<stdio.h> #include<string.h> ]; int main() { ],s2[]; int l1,l2,i,j,k; while(scan ...

  5. [GO]panic的应用

    对于异常的处理,error表示的是不太致使的错误,但是如果遇到数组越界或者是空指针这种会导致程序崩溃无法恢复的错误时,就需要使用以panic了 我们不应该使用panic去报error的错误,而是只使用 ...

  6. jmeter- 性能测试3:聚合报告(Aggregate Report )

    jmeter-监听器-聚合报告样例: 字段说明: label:请求名称,自己定义的 #Samples:这次测试中一共发出了多少个请求,如果模拟20个用户,每个用户迭代20次,那么就是400(未设置持续 ...

  7. Mybatis 拦截器报错org.apache.ibatis.executor.statement.StatementHandler.prepare(java.sql.Connection)

    出现此错误的原因是MyBatis 3.4.0 之后,StatementHandler的prepare方法做了修改,如下: 在args = { Connection.class }中添加第二个参数,即 ...

  8. 1:C#的三种异步的详细介绍及实现

    一.介绍异步的前世今生: 异步编程模型 (APM,Asynchronous Programming Model) 模式(也称 IAsyncResult 模式),在此模式中异步操作需要 Begin 和 ...

  9. Log4net日志

    log4net简介(摘抄于百度百科):      log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库 ...

  10. CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose

    CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客 ...