如下示例代码:将 3 个 checkbox 都勾选上。为什么 setAttribute 可以,直接给checked 赋值却不行?
var test = document.getElementById('test');
// 可以
for (var i = 0; i < 3; i++) {
test.innerHTML += `<input type="checkbox" class="c" />`;
document.getElementsByClassName('c')[i].setAttribute('checked',true);
}
// 不可以
for (var i = 0; i < 3; i++) {
test.innerHTML += `<input type="checkbox" class="c" />`;
document.getElementsByClassName('c')[i].checked = true;
}
根据 HTML DOM checked 属性 中的例子选定以及不选定 checkbox ,checkboxObject.checked=true|false 直接赋值是可以改变checkbox的勾选状态的。
你那种写法的结果是三个checkbox的最后一个勾选了。原因是for循环到i=3时,test.innerHTML+=赋值的是三个没有checked属性的,然后跟着执行了document.getElementsByClassName('c')[3].checked = true这句,所以,只有最后一个勾选了。你可以打个断点看下,for循环的每个i执行的时候,都是当前i对应的那个checked设置了true。
改成两次for循环的话,能成功:
另外一种办法就是将代码改成如下:(input里面加了checked)这样就可以了。
至于原因,我想可能是innerHTML设置的checkbox不包含checked属性,而setAttribute()方法是创建或改变某个新属性,可以给它创建这个checked属性,而.checked赋值只是用来改变其默认值,不能给input创建checked属性。
另外说明几点: