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


我在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 原型,但这两种尝试都引发了同样的错误。

是什么造成的?


8855
2018-05-02 02:32


起源

对我来说,这适用于bestbuy网站,在控制台中没有任何问题。虽然它不完全是IE8但IE8中的IE8模式。 - Tomas Kirda
@TomasKirda是的,在IE8中尝试使用VM,让我知道它是否有效。 - Justin Meltzer
很抱歉找不到问题,但我不明白为什么你不是简单地使用document.body.appendChild(p); - 1nfiniti
@JustinMeltzer:您能否提供更准确的URL参考,以便可以复制或提供问题 的jsfiddle 演示? - Oleg
@JustinMeltzer:在JavaScript控制台中进行测试可能会得到错误的结果。我提醒一本关于JavaScript的书和另一篇关于本书错误部分的长篇评论文章。本书的作者写了一些关于基于JavaScript控制台的Web浏览器的陈述,而不是使用JavaScript程序。所以书中有一些错误的信息(总的来说非常好)。你真的有什么问题并试图解决?你需要在页面上注入一些元素吗?你写了一些浏览器插件吗?你能创建具有相同问题的干净的jsfiddle演示吗? - Oleg


答案:


编辑

“什么样的代码可能会导致此错误?”

似乎错误与此相关 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>');

我查看了许多插件,但找不到导致重载或冲突的确切代码行,但它必须在那里,更可能是因为嗅探用户代理。


9
2018-05-05 00:06



有趣。没有意识到它是特定的 document.body。什么样的代码可能导致此错误?你能想到任何解决错误的方法(虽然仍然可以使用 document.body)? - Justin Meltzer
@JustinMeltzer - 我找不到原因。也许有一个拦截函数调用,也许iframe在某种程度上被用作预防工具(不太可能),或者也许 body 是某种自定义实现专门重载的。 - Travis J
@JustinMeltzer - 有关更多信息,请参阅编辑。 - Travis J


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

什么是IE对HTMLDocument和HTMLElement

IE7中没有“元素”。


1
2018-05-07 09:47