11

我在 IE8 中的 bestbuy.com 上发现了一个错误,我似乎无法理解它为什么会发生。它也出现在 comcast.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,但是这两种尝试都抛出了相同的错误。

这是什么原因造成的?

4

2 回答 2

9

编辑

“什么样的代码可能导致这个错误?”

该错误似乎与document.body由于页面处于严格模式而导致不可用有关。作为指令的结果,在 bestbuy 进入模式:

<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">

对于 Internet Explorer,chrome=1创建Google 内容框架 (GCF)的选项将强制页面以严格模式运行。comcast.com 处于严格模式,因为其 doctype 标头使用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>');

我查看了许多插件,找不到导致过载或冲突的确切代码行,但它必须存在,很可能是嗅探用户代理的结果。

于 2013-05-05T00:06:05.760 回答
1

调试器对 Travis 的代码说“'Element' is undefined”,而我在加载页面时收到的唯一 JS 异常是 'hasAttribute' 是不受支持的方法。两者都仅在 IE8 以兼容模式(文档模式:IE7 标准)加载页面时发生,但可能我加载的页面与您的不同:您的代码使用 Element,因此异常与 Travis 的代码相同。这是答案:

IE 对 HTMLDocument 和 HTMLElement 有何影响

IE7 中没有“元素”。

于 2013-05-07T09:47:57.517 回答