如何querySelectorAll元素添加到DOM和javascript?
How to querySelectorAll elements added to the DOM with javascript?
我正在开发一个聊天应用程序,当我尝试向聊天室列表添加新元素、查看它们并在不重新加载页面的情况下与它们交互时,我的问题出现了。
我正在将 HTML 个元素添加到具有 JavaScript 的列表中。
然后我尝试查询列表中的SelectorAll元素。
可以select编辑页面加载时从服务器加载的元素。
但是带有 JavaScript 的新创建的元素似乎没有得到 selected。
以下是我如何尝试 select 我的元素,并在单击时为每个元素执行一些代码:
document.querySelectorAll('.select-room').forEach(p => {
p.onclick = () => { <my code here> })
已在列表中的元素 select 编辑得很好,我的代码执行正常。
但是当我用 JavaScript 添加一个新元素时。即使它的 HTML 看起来与其他现有元素的 HTML 一样,包括它获得 selected 的 class,结果是我只能select 重新加载页面后的那些。
有没有一种方法可以监听对 DOM 所做的更改,以便在添加 JavaScript 具有相同 class 的新元素后,它们将是 select像其他人一样无需重新加载页面?
这是我的问题 Minimal, Complete, Reproducible Example:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>mcr problem</title>
<script>
document.addEventListener("DOMContentLoaded", () => {
// Clicking element in the list shows an alert.
document.querySelectorAll(".clickable").forEach(li => {
li.onclick = () => {alert("interaction!")};
});
// Clicking on button adds new element to the list
document.querySelector("#add-btn").onclick = () => {
newLi = document.createElement("li");
newLi.classList.add("clickable");
newLi.innerHTML = "New Item";
document.querySelector("#parent-list").append(newLi);
};
});
</script>
</head>
<body>
<h1>List of items</h1>
<button id="add-btn">Add</button>
<ul id="parent-list">
<li class="clickable" id="post-1">Item 1</li>
<li class="clickable" id="post-2">Item 2</li>
<li class="clickable" id="post-3">Item 3</li>
</ul>
</body>
</html>
警报未被调用的原因 DOMContentLoaded
此事件在 DOM 树形成时触发,即脚本正在加载。在图像、CSS 和 JavaScript 等所有资源加载之前,脚本开始 运行。您可以将此事件附加到 window 或文档对象
并且当时查询选择器只有 class .clickable
的 3 个节点,因此它仅适用于这 3 个元素。
在 javascript DOMNodeInserted
当脚本使用 appendChild()、replaceChild()、insertBefore() 等在 DOM 树中插入一个新节点时触发
document.addEventListener("DOMContentLoaded", () => {
document.querySelectorAll(".clickable").forEach((li) => {
li.onclick = () => commonAlertMethod();
});
// Clicking on button adds new elemnt to the list
document.querySelector("#add-btn").onclick = () => {
newLi = document.createElement("li");
newLi.classList.add("clickable");
newLi.innerHTML = "New Item";
document.querySelector("#parent-list").append(newLi);
};
});
document.addEventListener("DOMNodeInserted", () => {
// Clicking element in the list shows an alert.
document.querySelectorAll(".clickable").forEach((li) => {
li.onclick = () => commonAlertMethod();
});
});
function commonAlertMethod() {
alert("interaction!");
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>List of items</h1>
<button id="add-btn">Add</button>
<ul id="parent-list">
<li class="clickable" id="post-1">Item 1</li>
<li class="clickable" id="post-2">Item 2</li>
<li class="clickable" id="post-3">Item 3</li>
</ul>
</body>
</html>
我正在开发一个聊天应用程序,当我尝试向聊天室列表添加新元素、查看它们并在不重新加载页面的情况下与它们交互时,我的问题出现了。
我正在将 HTML 个元素添加到具有 JavaScript 的列表中。
然后我尝试查询列表中的SelectorAll元素。
可以select编辑页面加载时从服务器加载的元素。
但是带有 JavaScript 的新创建的元素似乎没有得到 selected。
以下是我如何尝试 select 我的元素,并在单击时为每个元素执行一些代码:
document.querySelectorAll('.select-room').forEach(p => {
p.onclick = () => { <my code here> })
已在列表中的元素 select 编辑得很好,我的代码执行正常。
但是当我用 JavaScript 添加一个新元素时。即使它的 HTML 看起来与其他现有元素的 HTML 一样,包括它获得 selected 的 class,结果是我只能select 重新加载页面后的那些。
有没有一种方法可以监听对 DOM 所做的更改,以便在添加 JavaScript 具有相同 class 的新元素后,它们将是 select像其他人一样无需重新加载页面?
这是我的问题 Minimal, Complete, Reproducible Example:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>mcr problem</title>
<script>
document.addEventListener("DOMContentLoaded", () => {
// Clicking element in the list shows an alert.
document.querySelectorAll(".clickable").forEach(li => {
li.onclick = () => {alert("interaction!")};
});
// Clicking on button adds new element to the list
document.querySelector("#add-btn").onclick = () => {
newLi = document.createElement("li");
newLi.classList.add("clickable");
newLi.innerHTML = "New Item";
document.querySelector("#parent-list").append(newLi);
};
});
</script>
</head>
<body>
<h1>List of items</h1>
<button id="add-btn">Add</button>
<ul id="parent-list">
<li class="clickable" id="post-1">Item 1</li>
<li class="clickable" id="post-2">Item 2</li>
<li class="clickable" id="post-3">Item 3</li>
</ul>
</body>
</html>
警报未被调用的原因 DOMContentLoaded
此事件在 DOM 树形成时触发,即脚本正在加载。在图像、CSS 和 JavaScript 等所有资源加载之前,脚本开始 运行。您可以将此事件附加到 window 或文档对象
并且当时查询选择器只有 class .clickable
的 3 个节点,因此它仅适用于这 3 个元素。
在 javascript DOMNodeInserted
当脚本使用 appendChild()、replaceChild()、insertBefore() 等在 DOM 树中插入一个新节点时触发
document.addEventListener("DOMContentLoaded", () => {
document.querySelectorAll(".clickable").forEach((li) => {
li.onclick = () => commonAlertMethod();
});
// Clicking on button adds new elemnt to the list
document.querySelector("#add-btn").onclick = () => {
newLi = document.createElement("li");
newLi.classList.add("clickable");
newLi.innerHTML = "New Item";
document.querySelector("#parent-list").append(newLi);
};
});
document.addEventListener("DOMNodeInserted", () => {
// Clicking element in the list shows an alert.
document.querySelectorAll(".clickable").forEach((li) => {
li.onclick = () => commonAlertMethod();
});
});
function commonAlertMethod() {
alert("interaction!");
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>List of items</h1>
<button id="add-btn">Add</button>
<ul id="parent-list">
<li class="clickable" id="post-1">Item 1</li>
<li class="clickable" id="post-2">Item 2</li>
<li class="clickable" id="post-3">Item 3</li>
</ul>
</body>
</html>