gpt4 book ai didi

javascript - 使用 XMLHttpRequest 更新元素后,addEventListener 停止监听

转载 作者:行者123 更新时间:2023-11-28 03:37:22 25 4
gpt4 key购买 nike

这是我的代码:

<html>
<head>
<script>
function init() {
var el = document.getElementById('mydiv2');
el.addEventListener('click', function() {
console.log('clicked');
});
}
function getcontent() {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
if (xhr.status == 200) {
document.getElementById('mydiv').innerHTML = xhr.responseText;
//init();
}
}
xhr.open("GET", "content.txt", true);
xhr.send();
}
</script>
</head>
<body onload="init()">
<div id="mydiv">
<div id="mydiv2">Some content</div>
</div>
<button type="button" onclick="getcontent()">Get new content</button>
</body>
</html>

文档加载后,会执行 init() 并向 div“mydiv2”添加一个点击监听器。单击按钮时,getcontent() 会获取一些内容并用新内容替换“mydiv”。

<div id="mydiv2">New content</div>

用新的 div 替换旧的 div,即使具有相同的 id,也会破坏与监听器的绑定(bind)。我的解决方法是简单地将 init() 添加到 xhr.onload 事件(在innerHTML 替换之后),以便重新附加监听器。我想知道我是否遗漏了什么或者有更好的解决方案。

最佳答案

这里的问题是,您将 click 事件监听器添加到 XHR 请求完成后从 dom 中删除的元素:

    function init() {
/* el has id of mydiv2 */
var el = document.getElementById('mydiv2');

/* click event added to mydivd2 */
el.addEventListener('click', function() {
console.log('clicked');
});
}

...

/* Parent of mydiv2 (ie mydiv) has contents replaced, which removes mydiv2 */
document.getElementById('mydiv').innerHTML = xhr.responseText;

要解决此问题,请考虑将 click 事件附加到不受 XHR 请求影响的 DOM 元素,例如按钮:

    function init() {

/* Obtain the button and add the click event to that instead */
var el = document.querySelector('button');
el.addEventListener('click', function() {
console.log('clicked');
});
}

关于javascript - 使用 XMLHttpRequest 更新元素后,addEventListener 停止监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com