【问题标题】:innerHTML seems to be the only good solution for thisinnerHTML 似乎是唯一好的解决方案
【发布时间】:2012-06-29 13:46:01
【问题描述】:

我有一个函数创建一个 HTML/CSS 消息框,我想在其中显示一个变量(已经使用 PHP json_encode() 进行了转义,不可能进行 XSS 注入)。 我想在硬编码消息中显示此变量,它始终是相同的消息。 该消息在 HTML 粗体标记之间显示此变量 <b></b>:

Message("Do you really want to delete <b>" + reference + "</b> ?");

传递给 Message() 函数的字符串将被添加到 div 标记中,如果我希望变量引用以粗体样式显示,我唯一的解决方案是使用 innerHTML。

很多人说“不要使用innerHTML,它没有规范化”,“这是微软的专有功能,它不是W3C,可能不再受支持”。

我一直使用 DOM 方法,但就我而言,DOM1 myDiv.firstChild.nodeValue 属性甚至 DOM3 myDiv.textContent 方法都不起作用,因为字符串仅显示为文本。

innerHTML 方法的优点是不会使用 HTML 实体转义 &lt;&gt;characters,不幸的是,我认为使用 DOM 方法不可能获得相同的结果。

我不能使用 document.createElement("b") 方法,这会使一切变得复杂,因为我希望我的 Message() 函数将完整样式的字符串作为一个参数。

所以我的想法是在某些情况下需要使用 innerHTML 而不是使事情复杂化,这取决于你如何使用它并不是一个坏习惯。

欢迎评论。

【问题讨论】:

  • 元素节点(有意义的节点)的.innerHTML 属性是一个文档化的 HTML5 特性。
  • @Pointy 谢谢,这是否意味着它会像微软的 XMLHttpRequest 一样成为 DOM 的一部分? w3.org/TR/html5/embedded-content-0.html#dom-innerhtml
  • 重要的一点是,今天所有重要的现代浏览器都支持它,包括所有 IE 版本、移动浏览器等。

标签: javascript html dom innerhtml


【解决方案1】:

大多数针对innerHTML 的讨论都已经过时了。 innerHTML 几乎得到普遍支持(在 IE 中存在一些狭窄的兼容性问题),现在是 HTML5 draft 的一部分,是 much faster 而不是 DOM 方法(EDIT:与否,请参阅 cmets),并产生更清晰的代码。

没有innerHTML,你想做的事情是可能的,但它并不漂亮:

var div = document.createElement("div");
var b = document.createElement("b");
b.appendChild(document.createTextNode(reference));
div.appendChild(document.createTextNode("Do you really want to delete "));
div.appendChild(b);
div.appendChild(document.createTextNode("?"));
Message(div);

您必须重构您的Message 函数以采用DOM Node(或Nodes 的数组)而不是文本字符串。总而言之,我会说这绝对不值得——除非你的目标是 IE5

【讨论】:

  • 是的,它不漂亮,也更复杂,这意味着你每次要显示消息时都必须创建 div 节点,这很愚蠢! div节点是在我的Message()函数中创建的,这个标签是MessageBox的一部分,所以在这个函数里面不创建div是废话:)
  • 顺便说一下,我不确定 innerHTML 是否比最近浏览器的 DOM 方法快 jsperf.com/…
  • 好吧,您可以生成一个子节点数组并使用Messsage 将它们作为子节点附加到 div 中,但这并没有好太多。您链接的 jsperf 测试似乎只使用 innerHTML 作为 getter,而不是 setter;我希望看到一个使用它来创建新节点的测试(也许我会做一个)。
  • 跟进:看起来innerHTML 在现代浏览器中的写入速度也较慢。 quirksmode 测试页面有“立即测试”链接,这表明(无论如何对我而言)DOM 方法现在的写入速度大约是原来的两倍。
【解决方案2】:

是的。您可以阅读关于 innerHTML 与其他方法的舒缓 quirksmode benchmark

【讨论】:

  • DOM3 textContent > DOM1 nodeValue > DOM0 innerHTML 根据本次测试jsperf.com/…
  • Quirksomde 基准测试是在 Firefox 3 和 Chrome 5 上完成的,性能似乎发生了变化..
【解决方案3】:

我相信.innerHTML 可以很好地使用。在此处查看兼容性统计信息:http://www.quirksmode.org/dom/w3c_html.html,它们还强调了使用此方法相对于 DOM 方法的性能提升。

【讨论】:

  • 谢谢,但您的测试已经过时(Firefox 3 和 Chrome 5),情况发生了变化,DOM 方法似乎比 innerHTML jsperf.com/…具有更好的性能@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多