我尝试在firefox中的一个元素上设置innerHTML并且它工作正常,在IE中尝试并且出现意外错误,没有明显的原因。
例如,如果您尝试将表的innerHTML设置为“hi from stu”,则会失败,因为该表必须后跟一个序列。
答案 0 :(得分:14)
您正在看到这种行为,因为innerHTML对于IE中的表元素是只读的。来自MSDN的innerHTML Property文档:
该属性是读/写的,除了以下所有对象,它是只读的:COL,COLGROUP,FRAMESET,HEAD,HTML,STYLE,TABLE,TBODY,TFOOT,THEAD,TITLE,TR。
答案 1 :(得分:3)
不知道为什么你会因为Stu这个问题而被降级,因为这是我最近解决的问题。诀窍是将HTML“喷射”到当前未附加到文档树的DOM元素中。以下是执行此操作的代码段:
// 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...
注意我们在此片段中仅使用jQuery来测试浏览器是否为IE,对jQuery没有硬性依赖。
答案 2 :(得分:1)
检查您尝试设置innerHTML的元素的范围。因为FF和IE以不同的方式处理这个问题
答案 3 :(得分:1)
答案 4 :(得分:1)
我一直在努力解决用不同的链接列表替换表格中的链接列表的问题。如上所述,问题在于IE及其表元素的readonly属性。
追加给我不是一个选择,所以我(最终)解决了这个问题(适用于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);
}
适合我 - 我希望它适合你
答案 5 :(得分:0)
“显然firefox不是这个挑剔”==&gt;显然FireFox是如此的错误,它没有记录这种明显违反基本的html嵌套规则......
正如有人在另一个论坛中指出的那样,FireFox会接受,你将一个完整的html文档附加为表单字段甚至是图像的子项, - (
答案 6 :(得分:0)
您是否尝试过设置innerText和/或textContent?当您尝试在IE中更改其innerHTML时,某些节点(如SCRIPT标记)将无法按预期运行。更多关于innerText与textContent的内容:
http://blog.coderlab.us/2006/04/18/the-textcontent-and-innertext-properties/
答案 7 :(得分:0)
您是在设置完全不同的innerHTML还是替换innerHTML中的模式?我问,因为如果你试图通过innerHTML的'power'做一个简单的搜索/替换,你会发现某些类型的元素没有在IE中播放。
通过围绕try / catch的尝试并通过parentNode冒泡DOM,直到您成功设法完成,可以谨慎地解决这个问题。
但是,如果您要插入全新的内容,这将不合适。
答案 8 :(得分:0)
您可以修改行为。这里有一些代码可以防止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)
答案 9 :(得分:-2)
我只是想通了如果你试图在IE中的一个元素上设置innerHTML,这个元素在逻辑上是不正确的,它会抛出这个错误。 例如,如果您尝试将表的innerHTML设置为“ hi from stu ”,则它将失败,因为该表必须后跟一个序列。 显然firefox不是那么挑剔。 希望它有所帮助。