bac*_*cab 3 html javascript checkbox
我正在尝试创建复选框并在每个复选框后插入一个空行。当复选框更改时,我想执行一个函数。
我的代码:
var div = document.getElementById("test");
var cb1 = document.createElement('input');
cb1.id = "cb_test1";
cb1.type = "checkbox";
cb1.defaultChecked = true;
cb1.onchange = function(){alert("hi")};
div.appendChild(cb1);
div.innerHTML += "box1<br/>";
var cb2 = document.createElement('input');
cb2.id = "cb_test1";
cb2.type = "checkbox";
cb2.defaultChecked = true;
cb2.onchange = function(){alert("hi")};
div.appendChild(cb2);
div.innerHTML += "box2<br/>";
Run Code Online (Sandbox Code Playgroud)
问题是,设置包含 DIV 的innerHTML 似乎会删除事件侦听器,因此当触发 onchange 事件时,不会发生任何事情。
如何修改innerHTML 以添加文本和新行而不丢失事件处理程序?
我的实际代码更加动态并且在循环中完成,但是事件处理程序被删除的问题可以用上面的代码重复。
每当您分配(或连接)innerHTML容器的属性时,该容器内通过 Javascript 连接的任何侦听器都将被损坏。如果您想插入 HTML 字符串,请改用insertAdjacentHTML:
document.querySelector('#child').onclick = () => console.log('child');
document.querySelector('#container').insertAdjacentHTML('beforeend', '<div>newchild</div>');Run Code Online (Sandbox Code Playgroud)
<div id="container">
<div id="child">
child
</div>
</div>Run Code Online (Sandbox Code Playgroud)
但通常最好是显式地创建和附加元素,而不是插入 HTML 标记字符串,然后将其解析为元素。例如,代替
div.innerHTML += "box1<br/>";
Run Code Online (Sandbox Code Playgroud)
你可以
div.appendChild(document.createTextNode('box1');
div.appendChild(document.createElement('br');
Run Code Online (Sandbox Code Playgroud)
div.innerHTML += "box1<br/>";
Run Code Online (Sandbox Code Playgroud)
div.appendChild(document.createTextNode('box1');
div.appendChild(document.createElement('br');
Run Code Online (Sandbox Code Playgroud)