在BestBuy的网站上,Internet Explorer 8中非常奇怪的案例行为

Jus*_*zer 11 javascript debugging internet-explorer internet-explorer-8

我在IE8中发现了bestbuy.com上的一个错误,我似乎无法理解它为什么会发生.它也出现在IE8等网站上,例如comcast.com和raymourflanigan.com,但不会出现在google.com或godaddy.com上.

以下代码抛出"Invalid procedure call or argument"错误(特别是最后一行是抛出错误):

var p = document.createElement("p");
var holder = Element.prototype.appendChild;
holder.apply(document.body, [p]);
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我在IE8的其他网站上尝试过,它就像一个魅力.我尝试使用.call而不是.apply,甚至将原始appendChild方法的引用存储到Element原型上的另一个变量,但这两个尝试都引发了相同的错误.

是什么造成的?

Tra*_*s J 9

编辑

"什么样的代码可能导致此错误?"

看起来该错误与document.body页面处于严格模式下的不可用有关.由于该指令,该模式在bestbuy中输入:

<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
Run Code Online (Sandbox Code Playgroud)

对于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]);
Run Code Online (Sandbox Code Playgroud)

为了测试这种行为,我做了这个小提琴: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]);
})()
Run Code Online (Sandbox Code Playgroud)

也许是因为他们的一个插件附着在身体上的东西.有趣的是,这可以在bestbuy.com的ie控制台上运行

$("body").append('<p>Append!</p>');
Run Code Online (Sandbox Code Playgroud)

我浏览了一些插件,找不到导致重载或冲突的确切代码行,但它必须在那里,更可能是因为嗅探用户代理.