javascript - 事件监听器不会触发 JavaScript 上动态创建的元素

标签 javascript html

我在触发动态创建的按钮时遇到问题。仅当元素是手动创建时,事件监听器才能正常工作。

<!DOCTYPE html>
<html>
<body>
<button id="create">Create new button</button>
<div id="mydiv"></div>

<script>
document.getElementById("create").addEventListener('click', (x) => {
document.getElementById("mydiv").innerHTML = "<button id='show'>Show alert</button>";});

document.getElementById('show').addEventListener('click', (b) => {
alert("It works");});
</script>
</body>
</html>

//用事件委托(delegate)整理出来:

<!DOCTYPE html>
<html>
<body>
<button id="create">Create new button</button>
<div id="mydiv"></div>

<script>
document.getElementById("create").addEventListener('click', (x) => {
    document.getElementById("mydiv").innerHTML = "<button class='show'>Show alert</button>";
});
const parent = document.getElementById('mydiv');
parent.addEventListener('click', (b) => {
if (x.target.className === 'show') {alert("It works")}
;});
</script>
</body>
</html>

最佳答案

您必须将绑定(bind)新元素的代码移动到创建它的代码的事件处理程序中,因为当新元素的事件绑定(bind)位于外部时,它会立即失败,因为该元素不存在。

换句话说,你必须等待元素存在才能绑定(bind)它。

<!DOCTYPE html>
<html>
<body>
<button id="create">Create new button</button>
<div id="mydiv"></div>

<script>
document.getElementById("create").addEventListener('click', (x) => {

  document.getElementById("mydiv").innerHTML = "<button id='show'>Show alert</button>";
  
  // This code won't be run until after the new element is created, so it will
  // be safe to reference it at that point.
  document.getElementById('show').addEventListener('click', (b) => {
    alert("It works");
  });
  
});


</script>
</body>
</html>

关于javascript - 事件监听器不会触发 JavaScript 上动态创建的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535598/

相关文章:

javascript - expressjs使用用户id查询数据库?

html - 在 Bootstrap 布局中重新排序 block

php - HTML 呈现问题 - 适用于 Mozilla Firefox,但不适用于 Google Chrome

javascript - 如何 trim 字符串的最后一个或最后两个字符

JavaScript 表过滤器不查找数字

javascript - 对鼠标悬停的图像部分进行取消模糊处理

html - 在悬停时显示,但仅在悬停的元素上显示

javascript - 如何使用新的 html 文件打开更新 Electron 浏览器窗口

javascript - 如何在 HTML 中的 li 元素上创建右键单击自定义菜单

javascript - socket.io - 数百个请求而不是一个连接