【问题标题】:If people recommend I shouldn't use .innerHTML, what then should I instead use? [duplicate]如果人们建议我不应该使用 .innerHTML,那么我应该改用什么? [复制]
【发布时间】:2011-09-19 20:05:24
【问题描述】:

可能重复:
JavaScript: Is it better to use innerHTML or (lots of) createElement calls to add a complex div structure?

我应该使用什么来代替.innerHTML?感谢所有建议。

【问题讨论】:

  • 谁推荐这样的东西?
  • 在什么情况下?你想做什么?
  • 他们为什么告诉你不要使用 .innerHTML?
  • 预测:告诉你这个的人使用 jQuery 和/或 Dreamweaver。准确吗?

标签: javascript


【解决方案1】:

正确的答案是在某些情况下你应该使用innerHTML,而在其他情况下你应该使用appendChild。下面是何时使用 innerHTML 或 appendChild:

  • 在 HTML 标记(如锚标记、段落标记、span、div 或 textarea)内设置文本时使用 innerHTML。

  • 如果您尝试在另一个 DOM 中添加新的 DOM 元素,请使用 appendChild() 元素。

【讨论】:

  • “正确的答案是在某些情况下你应该使用innerHTML...”我认为说你“应该” 使用innerHTML,但它肯定是一个选项。
  • 我的意思是说“应该使用”。与直接使用 DOM 对象相比,字符串连接的计算成本更高。因此,使用 appendChild() 添加新的 DOM 对象是一种很好的做法,当您真正想要插入文本时,使用 innerHTML 是一种很好的做法。
  • 是的,但是说使用.innerHTML 插入文本是“良好做法”与说你“应该”使用@987654324 不同@ 为了那个原因。如果您想插入一些文本,使用document.createTextNode().appendChild() 没有任何问题。但我同意对 DOM 元素使用 appendChild() 和类似内容是一种很好的做法。
  • 其实,如果你只是添加文字,使用innerText
  • @YiddishNinja innerText 是非标准的,但它得到了相当广泛的支持:caniuse.com/#search=innerText
【解决方案2】:

没有任何上下文,只有一个规则:没有规则。

在任何情况下,编程中都不会盲目地遵循某些“规则”,而不管上下文如何。如果 innerHTML 本质上是 eval,我的意思是邪恶的,它就不会在语言规范中开始!

使用 innerHTML 的替代方法取决于您要执行的操作、您拥有的(如果有的话)javascript 库以及您的目标浏览器(如果有的话)。

当您创建新的 HTML 部分时,您可以使用 document.createElement (docs) 来制作每个元素,使用 appendChild 等将元素相互添加。如果您将元素的文本从“蓝色”更改为“红色”,您可以使用 innerHTML 来完成此操作(假设您不使用任何流行的 javascript 框架)。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 实际上 innerHTML 完全符合 W3C 标准,根据此处的实际 W3C 文档:w3.org/TR/DOM-Parsing "DOMParser, XMLSerializer, innerHTML, and similar APIs" 并且根据此处,所有浏览器都支持它,包括IE8+caniuse.com/#search=innerHTML
    • innerHTML 在答案指定的情况下很好。
    • .innerHTML 在 2011 年确实是非标准的。@jonlink:它只能始终用于代替.appendChild(),但要做到这一点,您需要使用+= new_data,它可以为您的代码引入错误。
    • 我意识到这个答案很旧,但由于 SO 是一个活生生的文档,所以值得一提。 2011 年几乎所有内容都是非标准的 :) 无论如何,我实际上是指使用 innerHTML 来填充或替换整个内容,所以 += new data 是不必要的。也就是说,它不是高性能的。例如,如果您想清空 innerHTML a while loop is better
    • 编辑:似乎 innerHTML 在 2011 年是标准的 (source)。也许您在考虑 innerText?
    【解决方案4】:

    实用时,最好自己创建 DOM 对象并将它们添加到 DOM 树中——性能会更好。对于复杂的元素,使用innerHTML 可能会更好,否则您将拥有无法维护的代码。

    【讨论】:

      【解决方案5】:

      就像the answer here,“使用 API”。 jQuery 在这方面比你好得多,而且它非常易于使用,所以就用它吧。

      好像没有人想点进去,所以我会引用答案。

      两者都没有。使用 jQuery、Prototype、Dojo 或 mooTools 等库 因为这两种方法都充满了麻烦:

      主要 javascript 库的作者有 花了很多时间并拥有完整的错误跟踪系统来确保 当您调用他们的 DOM 修改工具时,它们实际上可以工作。

      如果您正在编写一个库来与上述工具竞争(而且很好 如果你是幸运的话),那么我会选择基于 性能,而 innerHTML 过去总是胜出,自从 innerHTML 是一种本机方法,可以肯定的是,它仍将是 最快的。

      这里的关键点是,正确完成 DOM 操作是一项足够复杂的任务,让人真正强烈地想使用库来抽象出您可能遇到的麻烦。

      【讨论】:

      • 添加整个库以避免使用 innerHTML 是一个可怕的建议
      【解决方案6】:

      您应该在 AJAX 请求之间交换对象(JSON 或 XML)而不是纯 HTML。然后,您需要在客户端上使用表示逻辑来处理数据(JSON 或 XML)并相应地更新 DOM。

      【讨论】:

      • 我为此 +1 了,因为我同意,但我认为他不是在问这个。我想他是在要求做 DOM 操作的东西,比如 createElement 等
      • 这和这个问题有什么关系?!
      猜你喜欢
      • 2016-08-22
      • 2012-04-21
      • 2014-08-31
      • 2011-03-15
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2011-04-22
      • 2011-05-16
      相关资源
      最近更新 更多