我尝试在 Firefox 中的一个元素上设置 innerHTML,它运行良好,在 IE 中尝试过,但没有明显原因出现意外错误。
例如,如果您尝试将表格的 innerHTML 设置为“hi from stu”,它将失败,因为表格后面必须有一个序列。
我尝试在 Firefox 中的一个元素上设置 innerHTML,它运行良好,在 IE 中尝试过,但没有明显原因出现意外错误。
例如,如果您尝试将表格的 innerHTML 设置为“hi from stu”,它将失败,因为表格后面必须有一个序列。
您会看到这种行为,因为 innerHTML 对于 IE 中的表格元素是只读的。来自 MSDN 的innerHTML 属性文档:
该属性对所有对象都是读/写的,除了以下对象,它是只读的:COL、COLGROUP、FRAMESET、HEAD、HTML、STYLE、TABLE、TBODY、TFOOT、THEAD、TITLE、TR。
不知道为什么你会因为 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 没有硬依赖。
检查您尝试设置 innerHTML 的元素的范围。因为 FF 和 IE 以不同的方式处理这个问题
我一直在与用不同的链接列表替换表中的链接列表的问题作斗争。如上所述,问题来自 IE 及其表元素的只读属性。
Append 对我来说不是一个选项,所以我(最终)解决了这个问题(适用于 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);
}
对我有用 - 我希望它对你有用
“显然 firefox 不是那么挑剔” ==> 显然 FireFox 是如此的错误,以至于它没有注册这种明显违反基本 html 嵌套规则的行为......
正如有人在另一个论坛中指出的那样,FireFox 将接受,您将整个 html 文档附加为表单域甚至图像的子项,-(
您是否尝试过设置 innerText 和/或 textContent?当您尝试在 IE 中更改它们的 innerHTML 时,某些节点(如 SCRIPT 标记)的行为将不会像预期的那样。更多关于 innerText 与 textContent 的信息:
http://blog.coderlab.us/2006/04/18/the-textcontent-and-innertext-properties/
您是在设置完全不同的 innerHTML 还是替换了 innerHTML 中的模式?我问是因为如果您尝试通过 innerHTML 的“功能”进行简单的搜索/替换,您会发现某些类型的元素不在 IE 中播放。
这可以通过在 try/catch 中包围您的尝试并通过 parentNode 冒泡 DOM 直到您成功地做到这一点来谨慎地解决。
但是,如果您要插入全新的内容,这将不合适。
您可以修改行为。下面是一些代码,可以防止在 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)
我刚刚发现,如果您尝试在 IE 中不正确的元素上设置 innerHTML,则会引发此错误。例如,如果您尝试将表格的 innerHTML 设置为“ hi from stu ”,它将失败,因为表格后面必须有一个序列。显然firefox不是那么挑剔。希望能帮助到你。