Event Target .add Event Listener() 在 innerHTML 之后不起作用
EventTarget.addEventListener() not working after innerHTML
我动态创建了一个带有 EventListener 的复选框。不幸的是,如果我用 innerHTML
更改复选框标签的文本,EventListener 将不起作用:
let label = document.createElement('label'),
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
label.innerHTML += 'Select Me!';
我怎样才能避免这个问题,为什么它会存在?
这里是没有 innerHTML
的工作片段:
let label = document.createElement('label'),
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
当您连接到元素的 innerHTML
时,其内容会被 清除 ,现有 HTML 字符串会与新字符串连接,并且然后根据新的 HTML 字符串重新计算容器的内容。 ~~Listeners~~ 附加到容器中先前元素的元素在序列化过程中无法存活 - 更改 innerHTML
后容器的子元素是 new.
附加一个文本节点:
let label = document.createElement('label');
let input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
label.appendChild(document.createTextNode('Select Me!'));
或使用insertAdjacentHTML
:
let label = document.createElement('label');
let input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
label.insertAdjacentHTML('beforeend', 'Select Me!');
我动态创建了一个带有 EventListener 的复选框。不幸的是,如果我用 innerHTML
更改复选框标签的文本,EventListener 将不起作用:
let label = document.createElement('label'),
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
label.innerHTML += 'Select Me!';
我怎样才能避免这个问题,为什么它会存在?
这里是没有 innerHTML
的工作片段:
let label = document.createElement('label'),
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
当您连接到元素的 innerHTML
时,其内容会被 清除 ,现有 HTML 字符串会与新字符串连接,并且然后根据新的 HTML 字符串重新计算容器的内容。 ~~Listeners~~ 附加到容器中先前元素的元素在序列化过程中无法存活 - 更改 innerHTML
后容器的子元素是 new.
附加一个文本节点:
let label = document.createElement('label');
let input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
label.appendChild(document.createTextNode('Select Me!'));
或使用insertAdjacentHTML
:
let label = document.createElement('label');
let input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.addEventListener('change', () => alert('Change Detected'));
label.appendChild(input);
document.body.appendChild(label);
label.insertAdjacentHTML('beforeend', 'Select Me!');