Всякий раз, когда вы назначаете innerHTML
контейнера (даже если вы просто объединяете с существующим HTML), содержимое контейнера будет удалено , а новая строка innerHTML
будет проанализировано и затем обработано браузером. Таким образом, слушатели, которые раньше были подключены к чему-либо внутри контейнера, больше не будут работать.
const container = document.querySelector('#container');
const child = container.children[0];
// Before: the child's parent is the `container`, as expected:
console.log(child.parentElement);
container.innerHTML += '';
// After: the child has no parent element!
// If a listener was attached to the child before,
// the child will no longer even be in the document!
console.log(child.parentElement);
<div id="container">
<div>child</div>
</div>
Для того, что вы делаете, используйте insertAdjacentHTML
, который не повредит слушателей, но будет выполнять функции, аналогичные innerHTML +=
:
var bt1;
document.addEventListener('DOMContentLoaded', load);
function load() {
document.body.innerHTML += '<div>welcome</div>';
bt1 = document.getElementById('bt1');
bt1.onclick = clicked;
}
function clicked() {
document.body.insertAdjacentHTML('beforeend', '<div>welcome</div>');
}
<body>
<button id="bt1">Click me</button>
</body>
Или явно создайте новый элемент для добавления и используйте appendChild
:
var bt1;
document.addEventListener('DOMContentLoaded', load);
function load() {
document.body.innerHTML += '<div>welcome</div>';
bt1 = document.getElementById('bt1');
bt1.onclick = clicked;
}
function clicked() {
const div = document.createElement('div');
div.textContent = 'welcome';
document.body.appendChild(div);
}
<body>
<button id="bt1">Click me</button>
</body>