为啥IE在设置innerHTML时会出现意外错误

Posted

技术标签:

【中文标题】为啥IE在设置innerHTML时会出现意外错误【英文标题】:Why does IE give unexpected errors when setting innerHTML为什么IE在设置innerHTML时会出现意外错误 【发布时间】:2010-09-14 09:38:00 【问题描述】:

我尝试在 firefox 中的一个元素上设置 innerhtml,它运行良好,在 IE 中尝试它并出现意外错误,没有明显的原因。

例如,如果您尝试将表格的 innerHTML 设置为“hi from stu”,它将失败,因为表格后面必须有一个序列。

【问题讨论】:

代码摘录可能有用... 【参考方案1】:

您会看到这种行为,因为 innerHTML 对于 IE 中的表格元素是只读的。来自 MSDN 的 innerHTML Property 文档:

该属性对于除以下对象外的所有对象都是读/写的,对于这些对象是只读的:COL、COLGROUP、FRAMESET、HEAD、HTML、STYLE、TABLE、TBODY、TFOOT、THEAD、TITLE、TR。

【讨论】:

这也给我在 SCRIPT 对象上造成了问题。【参考方案2】:

不知道为什么你会因为 Stu 的问题而被降级,因为这是我最近解决的问题。诀窍是将HTML“喷射”到当前未附加到文档树的DOM元素中。这是执行此操作的代码 sn-p:

// removing the scripts to avoid any 'Permission Denied' errors in IE
var cleaned = html.replace(/<script(.|\s)*?\/script>/g, "");

// IE is stricter on malformed HTML injecting direct into DOM. By injecting into 
// an element that's not yet part of DOM it's more lenient and will clean it up.
if (jQuery.browser.msie)

    var tempElement = document.createElement("DIV");
    tempElement.innerHTML = cleaned;
    cleaned = tempElement.innerHTML;
    tempElement = null;

// now 'cleaned' is ready to use...

注意我们这里sn-p中只使用jQuery来测试浏览器是否为IE,对jQuery没有硬依赖。

【讨论】:

【参考方案3】:

检查您尝试设置innerHTML 的元素的范围。因为 FF 和 IE 以不同的方式处理这个问题

【讨论】:

【参考方案4】:

http://www.ericvasilik.com/2006/07/code-karma.html

【讨论】:

有趣的故事。 IE 有这个 bug 并不是什么大问题。但是,我很生气他们知道这个错误至少 12 年,但它仍然没有修复。它在 IE8 中。【参考方案5】:

我一直在努力解决用不同的链接列表替换表中的链接列表的问题。如上所述,问题来自 IE 及其表格元素的只读属性。

Append for me 不是一个选项,所以我(最终)解决了这个问题(适用于 Ch、FF 和 IE 8.0(尚未尝试其他版本 - 但我充满希望)。

replaceInReadOnly(document.getElementById("links"), "<a href>........etc</a>");

function replaceInReadOnly(element, content)
    var newNode = document.createElement();
    newNode.innerHTML = content;
    var oldNode = element.firstChild;
    var output = element.replaceChild(newNode, oldNode);

对我有用 - 我希望它对你有用

【讨论】:

【参考方案6】:

“显然 firefox 不那么挑剔” ==> 显然 FireFox 有很多缺陷,以至于它没有记录这种明显违反基本 html 嵌套规则的行为 ...

正如有人在另一个论坛中指出的那样,FireFox 会接受,您将整个 html 文档附加为表单域甚至图像的子级,-(

【讨论】:

浏览器的目的是尽可能地向用户呈现提供给用户的信息——这意味着试图从作者错误中恢复。【参考方案7】:

您是否尝试过设置 innerText 和/或 textContent?当您尝试在 IE 中更改它们的 innerHTML 时,某些节点(如 SCRIPT 标记)的行为将不会像预期的那样。更多关于 innerText 与 textContent 的信息:

http://blog.coderlab.us/2006/04/18/the-textcontent-and-innertext-properties/

【讨论】:

【参考方案8】:

您是在设置完全不同的 innerHTML 还是替换了 innerHTML 中的模式?我问是因为如果您尝试通过 innerHTML 的“功能”进行微不足道的搜索/替换,您会发现某些类型的元素不在 IE 中播放。

这可以通过在 try/catch 中包围你的尝试并通过 parentNode 冒泡 DOM 直到你成功地做到这一点来谨慎地解决。

但如果您要插入全新的内容,这将不适合。

【讨论】:

【参考方案9】:

您可以修改行为。下面是一些防止在 IE 中对其他引用的元素进行垃圾收集的代码:

if (/(msie|trident)/i.test(navigator.userAgent)) 
 var innerhtml_get = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").get
 var innerhtml_set = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").set
 Object.defineProperty(HTMLElement.prototype, "innerHTML", 
  get: function () return innerhtml_get.call (this),
  set: function(new_html) 
   var childNodes = this.childNodes
   for (var curlen = childNodes.length, i = curlen; i > 0; i--) 
    this.removeChild (childNodes[0])
   
   innerhtml_set.call (this, new_html)
  
 )


var mydiv = document.createElement ('div')
mydiv.innerHTML = "test"
document.body.appendChild (mydiv)

document.body.innerHTML = ""
console.log (mydiv.innerHTML)

http://jsfiddle.net/DLLbc/9/

【讨论】:

【参考方案10】:

我刚刚发现,如果您尝试在 IE 中的一个逻辑上不正确的元素上设置 innerHTML,则会引发此错误。 例如,如果您尝试将表格的 innerHTML 设置为“ hi from stu ”,它将失败,因为表格后面必须有一个序列。 显然firefox不是那么挑剔。 希望对您有所帮助。

【讨论】:

我的意思是:*** 旨在成为人们可以为技术问题寻求良好技术答案的地方。我发现了一些不明显的东西,并认为我会将其添加到知识库中。不写问题就没有办法做到这一点,所以我做了并回答了。 你可能会被否决,因为这个答案的大部分实际上都属于这个问题——你最初并没有确切地说出你想要做什么。我现在已经把其中的一部分移到了这个问题上。

以上是关于为啥IE在设置innerHTML时会出现意外错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在网页里用了css滤镜后浏览时会出现IE安全警告?

为啥存储此向量时会出现分段错误?

为啥快速跳转到另一个页面时会出现意外空间

为啥当我发出信号时会出现分段错误

设置 innerhtml 时出现 IE 未知运行时错误

为啥 Jest 在测试“Colyseus”游戏时会出现这个错误?