当人们选择下拉菜单时,如果所选的下拉列表值不为空,则会自动选中该复选框。但我遇到了“sel [i]未定义”错误。
Javascript部分:
var chk = document.getElementsByTagName("input");
var sel = document.getElementsByTagName("select");
for (var i=0; i< sel.length; i++) {
sel[i].onchange = function(){
if (sel[i].value !== ''){
chk[i].checked = true;
}
else{
chk[i].checked = false;
}
};
}
HTML部分:
<form name="form1">
<div class="container">
<input id='checkbox_id1' name='checkbox_id1' type='checkbox' value='1' /></label>
Select
<label>
<select id="select_id1" name="select">
<option value=""></option>
<option value="111">111</option>
<option value="222">222</option>
</select>
</label>
<hr>
<input id='checkbox_id2' name='checkbox_id1' type='checkbox' value='1' /></label>
Select
<label>
<select id="select_id2" name="select">
<option value=""></option>
<option value="111">111</option>
<option value="222">222</option>
</select>
</label>
</div>
jsfiddle:http://jsfiddle.net/planetoid/GwEuu/
答案 0 :(得分:2)
i
的值不是您认为的,因为for
循环在实际调用任何事件处理程序之前已经完成,因此i
是值{ for
循环结束。
要为每个事件处理程序捕获i
的适当值,您可以使用这样的自执行函数,在每个特定事件处理程序的闭包中捕获它:
var chk = document.getElementsByTagName("input");
var sel = document.getElementsByTagName("select");
for (var i = 0; i < sel.length; i++) {
(function(i) {
sel[i].onchange = function(){
chk[i].checked = sel[i].value !== '';
}
})(i);
}
工作演示:http://jsfiddle.net/jfriend00/yds6w/
仅供参考,我还简化了.checked
分配代码。
但是,在稍微查看一下你的代码之后,我相信这可能是一种更好的实现它的方法,它不需要自动执行功能。这不仅仅依赖于完全并行的复选框和输入标签数组,而只是将select的ID转换为相应复选框的ID,并使用this
来引用select元素。因此,i
未在事件处理程序中使用。
var sel = document.getElementsByTagName("select");
for (var i = 0; i < sel.length; i++) {
sel[i].onchange = function(){
var checkboxId = this.id.replace("select_", "checkbox_");
document.getElementById(checkboxId).checked = this.value !== '';
}
}
答案 1 :(得分:1)
我看到jfriend00打败了我,但你也可以使用这种语法来达到同样的效果(我也缩短了内码):
var chk = document.getElementsByTagName("input"),
sel = document.getElementsByTagName("select");
for (var i=0; i< sel.length; i++) {
sel[i].onchange = (function (i) {
return function(){
chk[i].checked = sel[i].value !== '';
};
}(i));
}