Issues with .innerHTML
您正在分配到.innerHTML
.这将导致重新创建元素的子体(请参见innerHTML
"On setting..."):
const oldReference = document.getElementById("element");
document.body.innerHTML += ""; // Assigning to innerHTML
const newReference = document.getElementById("element");
const isSameElement = oldReference === newReference;
console.log({ isSameElement });
<div id="element">
如您所见,旧的引用btn
和inpt
将不是DOM中当前的元素.
Sidenote:解析.innerHTML
可能非常耗时,它与用户输入的结合使用是security issue.
特别是对于用户输入,您不应该使用.innerHTML
,因为这是一种将脚本插入网页的简单方法:
document.body.addEventListener("click", evt => {
if (!evt.target.closest("button")) return;
const input = document.querySelector("input");
document.body.innerHTML += input.value;
});
pre{padding:2px 4px;border:1px solid;width:min-content}
<input><button>Insert</button>
<p>Try to input this:</p>
<pre><code><img src=""
onerror="console.log('any script here!')"></code></pre>
<p>Then look into your browser console.
Alternatives for .innerHTML
如果要添加元素,可以使用document.createElement()
、Element.append()
和Node.textContent
:
const input = document.querySelector("input");
document.querySelector("button").addEventListener("click", evt => {
const p = document.createElement("p");
p.textContent = input.value;
document.body.append(p);
input.value = "";
const currentInput = document.querySelector("input");
console.log("Is same input?", input === currentInput);
});
<input><button>Insert</button>
<p>Also try adding some HTML, for example: <code><span>Test</span>