他们都是“正确的”。两者都在不同的时间用于不同的目的。
例如,就页面速度而言,如今只需执行以下操作会更快:
document.body.innerHTML = "<header>....big string o' html text</footer>";
浏览器会立即将其吐出。
为了安全起见,在处理用户输入时,构建元素,将它们附加到 adocumentFragment
然后将它们附加到 DOM(或用新版本替换 DOM 节点,或其他)会更安全。
考虑:
var userPost = "My name is Bob.<script src=\"//bad-place.com/awful-things.js\"></script>",
paragraph = "<p>" + userPost + "</p>";
commentList.innerHTML += paragraph;
相对:
var userPost = "My name is Bob.<script src=\"//bad-place.com/awful-things.js\"></script>",
paragraph = document.createElement("p");
paragraph.appendChild( document.createTextNode(userPost) );
commentList.appendChild(paragraph);
一个做坏事,一个不做。
当然,您不必创建textNodes
,您可以使用innerText
ortextContent
或其他任何东西(浏览器将自行创建文本节点)。
但考虑您共享的内容和方式始终很重要。
如果它来自您信任的地方以外的任何地方(应该几乎无处可去,除非您提供静态页面,在这种情况下,您为什么要构建 html?),那么您应该牢记注入 - 只有东西你想被注射应该是。