我在IE8中发现了bestbuy.com上的一个错误,我似乎无法理解它为什么会发生。它也出现在com8.com和raymourflanigan.com等网站上的IE8中,但不会出现在google.com或godaddy.com上。
以下代码抛出一个 "Invalid procedure call or argument"
错误(特别是最后一行是什么引发错误):
var p = document.createElement("p");
var holder = Element.prototype.appendChild;
holder.apply(document.body, [p]);
这很奇怪,因为我在IE8的其他网站上尝试过,它就像一个魅力。我试过用 .call
代替 .apply
,甚至存储对原始的引用 appendChild
方法到另一个变量 Element
原型,但这两种尝试都引发了同样的错误。
是什么造成的?
编辑
“什么样的代码可能会导致此错误?”
似乎错误与此相关 document.body
由于页面处于严格模式而无法使用。由于该指令,该模式在bestbuy中输入:
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
关于Internet Explorer,选项 chrome=1
创造一个 Google内容框架(GCF) 将强制页面以严格模式运行。由于其doctype标题使用,comcast.com处于严格模式 XHTML
。
在IE中有多种方法可以进入文档模式
页面处于严格模式的最终结果是渲染表面变为可用 document.documentElement
。此代码将在查看区域的底部附加文本和段落:
var p = document.createElement("p");
p.innerHTML = "APPEND";
var holder = Element.prototype.appendChild;
holder.apply(document.documentElement, [p]);
我做了这个小提琴,以测试这种行为: http://jsfiddle.net/LAkQk/
我首先决定在多个浏览器中测试这种行为。
在chrome,firefox,safari和IE8中运行没有错误。
请注意,要在ie8上测试这个小提琴(或任何真正的小提琴),你必须使用 /embedded
然后单击“结果”。
因此,我们首先要确认这些网站上存在导致冲突的内容。
我能够在bestbuy.com上使用IE8重复该错误,并确认它在google.com上有效
但是,这是 不 一个问题 apply
要么 appendChild
按照说。通过这个问题特别是一个问题 document.body
。您可以在bestbuy.com上使用此代码自行测试:
(function(){
var p = document.createElement("p");
p.innerHTML = "APPEND";
var holder = Element.prototype.appendChild;
var d = document.getElementById("header");
holder.apply(d, [p]);
})()
也许是因为他们的一个插件附着在身体上的东西。有趣的是,这可以在bestbuy.com的ie控制台上运行
$("body").append('<p>Append!</p>');
我查看了许多插件,但找不到导致重载或冲突的确切代码行,但它必须在那里,更可能是因为嗅探用户代理。
调试器说“Travis”代码“'元素'未定义”,加载页面时我收到的唯一JS异常是“hasAttribute”是一种不支持的方法。两者都发生在IE8以兼容模式(文档模式:IE7标准)加载页面时,但我可能加载了与您不同的页面:您的代码使用Element,因此异常将与Travis的代码相同。
这是答案:
什么是IE对HTMLDocument和HTMLElement
IE7中没有“元素”。