如何进行js动态生成option?如何实现二级连动?
何为二级连动?
首先要明白什么是二级连动!顾名思义,就是一个动,另外一个也跟着一起动
看下面的例子:

这里有一个“市级”的选择列表框,还有一个“县级”的选择列表框,如果“市级”的选择列表框中的值发现变化,那么会连带“县级”的列表框发生变化。
function selectOrg(){
var selectNow = document.getElementById("city"); //得到当前<select id="city">的对象
var url = '<%=path%>/rb-addressBillServices.do'; //发送请求的路径
Ext.Ajax.request({ //利用Ext的AJAX向后台发送请求
url:url,
method:'post',
params:{
method:'getOrgName()', //后台执行的方法名
responseType : 'text'
},
success: function(msg){
var orgarr = msg.responseText.split("|"); //因为后台传递过来的是形式为 1,张三 | 2,李四 | 3,王五
for(var i=0; i<orgarr.length; i++){
var org = orgarr[i].split(","); //得到数组 1,张三
addOption(selectNow,org[1],org[0]); //调用addOption方法,进行赋值,下面
}
},
failure: function (){
Ext.Msg.alert('系统提示','保存失败!');
}
});
}
这个方法是一个通用的动态添加Option,得到select的id,从数据库中查询到实际值id和显示值name,分别存入到text和value中
function addOption(objSelectNow, txt, val) {
var objOption = document.createElement("OPTION"); // 使用W3C标准语法为SELECT添加Option
objOption.text = txt; //得到显示值
objOption.value = val; //得到实际值
objSelectNow.options.add(objOption); //把每一个option添加到select中
}
当页面加载的时候,我们已经能够把数据动态的存入到select下拉列表中了,那么,接下来,我们就要实现所谓的二级连动了:
在select 中添加对应的onchange事件,也就是当第一个“市级”下拉框中的值改变时,把第二个下拉框中的值进行改变:

添加函数:changeCity(this)
function changeCity(obj){
var selectNow = document.getElementById("county");
var url = '<%=path%>/rb-addressBillServices.do';
if(obj.value == 0){
for(var k=selectNow.length-1; k>=0; k--){
selectNow.options.removeChild(selectNow.options[k]); //这里一定要进行倒序删除
}
selectNow.options.add(new Option("请选择县","0"));
}else{
Ext.Ajax.request({
url:url,
method:'post',
params:{
responseType : 'text',
method:'getOrgNameToCounty()&',
opval:obj.value
},
success: function(msg){
for(var k=selectNow.length-1; k>=0; k--){
selectNow.options.removeChild(selectNow.options[k]);
}
var orgarr = msg.responseText.split("|");
for(var i=0; i<orgarr.length; i++){
var org = orgarr[i].split(",");
addOption(selectNow,org[1],org[0]);
}
},
failure: function (){
Ext.Msg.alert('系统提示','保存失败!');
}
});
}
}
这里为什么要进行删除呢?你想啊,比如说:你在第一个下拉框中选中了“河北省”,那么,对应的在第二个下拉框中,就会出现在“河北省”中的各个市,现在问题就来了,假如你把第二个下拉框中的值不进行删除,那么,当你再选择“河南省”,那么恐怖的事情就发生了,刚才“河北省”中的各个市还存在第二个下拉框中,而点击了下拉框又会触发了onchange事件,那么第二个下拉框中就会存在“河北省”和“河南省”两个省份的市级信息,所以,我们要进行删除
知道了为什么要进行删除,那么我们还为什么要进行倒序删除呢?再举个例子,假如,我们就是正序进行的删除,那么,相应的代码会是这样:
for(var k=0;k<selectNow.length; k++){
selectNow.options.removeChild(selectNow.options[k]);
}
假设还是刚才的选择了“河北省”,那么其实在第二个市级下拉框中会存在一个类似的集合,里面包括河北省的11个市,当再选择“河南省”时,我们会删除原有的“河北省”的11个市的信息,那么运行for循环:
第一次: k=0; 删除的元素 selectNow.options[0] 剩下的元素会发生变化吗?[1,2,3],删除了list.get(0),那么2会成为list.get(0)
第二次: k=1; 删除的元素 selectNow.options[1] 删除了第二个元素,但第一个元素呢?没有进行删除
list = [1,2,3,4]
第一次删除 : 移除元素1 剩下元素 [2,3,4]
第二次删除 : 移除元素3 剩下元素 [2,4]
元素2永远也不会再被删除掉,所以,我们要进行倒序删除
如何进行js动态生成option?如何实现二级连动?的更多相关文章
- js动态生成下拉列表
经常需要用到js动态生成下拉列表的功能,记录下来备用. 示例需求:通过ajax请求,从后台获取用户姓名列表,并添加到下拉列表中.js代码如下: function getNameList(){ //如果 ...
- JS动态生成的元素,其对应的方法不响应(比如单击事件,鼠标移动事件等)
主要原因:在页面给元素注册点击事件的时候[ $(function () { XXX }); ],JS动态生成的元素还尚未生成,所以click事件就没有生效 解决方法: 方案一:js动态生成元素后再给 ...
- 抓取Js动态生成数据且以滚动页面方式分页的网页
代码也可以从我的开源项目HtmlExtractor中获取. 当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢? 如类似今日头条这样的网 ...
- js动态生成数据列表
我们通常会使用table标签来展示数据内容,由于需要展示的数据内容是随时更换的,所以不可能将展示的数据列表写死在html写死在页面中,而是需要我们根据后台传来的数据随时更换,这个时候就需要我们使用js ...
- 2)JS动态生成HTML元素的爬取
2)JS动态生成HTML元素的爬取 import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.W ...
- qrcode.js 动态生成二维码
用qrcode.js动态生成二维码图片非常简单,只需要引入qrcode.js即可使用,而且可以自定义图片大小.背景色等信息. 1.jsp代码---页面头部引入qrcode.js,jquery文件可选 ...
- js 动态生成html 触发事件传参字符转义
通常,在使用 JS 动态生成 html 的过程中,会嵌入相应的样式.事件等属性元素,而这时经常会出现所谓的 “单.双引号不够用” 的情况,别急,这时可以利用 html 语言中的转义字符来解决.下面就来 ...
- IE8下动态生成option无法设置文本内容
问题: 1.在IE8下,JS动态添加 option 的时候,value 有值,但是文本内容添加不上 例:<option value="北京"></option&g ...
- 爬虫案例(js动态生成数据)
需求:爬取https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/018d244441062d8916dd472a4c6a0a0b.html页面中的 ...
随机推荐
- Raspberry Pi3 ~ 安装samba服务
文章转载自此博文 1. sudo apt-get install samba 如果出现错误提示,则需要先执行sudo apt-get update,再重新执行sudo apt-get install ...
- Canvas 2D绘制抗锯齿的1px线条
当绘制1像素的线条时,发现多条线明显存在着粗细不均的问题,线条带有明显的锯齿. 事实上,Canvas的绘制线条指令都存在这个状况,如lineTo,arcTo,strokeRect. 解决方案是将Can ...
- hadoop中HBase子项目入门讲解
HBase 是Hadoop的一个子项目,HBase采用了Google BigTable的稀疏的,面向列的数据库实现方式的理论,建立在hadoop的hdfs上,一方面里用了hdfs的高可靠性和可伸缩行, ...
- xe mysql
[FireDAC][Phys][MySQL]-314. Cannot load vendor library [libmysql.dll or libmysqld.dll]. The specifie ...
- Hadoop应用开发实战案例 第2周
比如,封面,是一网页,可以看出用户在此网页上,鼠标呈现F形状. 海量Web日志分析 用Hadoop提取KPI统计指标 更详细原文博客:http://blog.fens.me/hadoop-mapred ...
- Javascript函数柯里化(curry)
函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...
- Unix 环境高级编程---线程创建、同步、
一下代码主要实现了linux下线程创建的基本方法,这些都是使用默认属性的.以后有机会再探讨自定义属性的情况.主要是为了练习三种基本的线程同步方法:互斥.读写锁以及条件变量. #include < ...
- jy
222 DROP TABLE t_vhl_jy_car; CREATE TABLE t_vhl_jy_car( VEHICLE_JY_CODE ) PRIMARY KEY, VEHICLE_CODE ...
- thinkPHP 无法create,无法插入数据,提示非法数据对象
4.thinkPHP 无法create,提示非法数据对象解决方法:不要create+add,而用 data[]= '';+add$m_r_fa_account = D('R_fa_account'); ...
- 通过css代码使边框变圆角(ie9以下浏览器不支持)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-02-11) CSS代码: <style> #myDiv { border-radius: 4px; /*这句就是 ...