javascript - BestBuy 网站上 Internet Explorer 8 中非常奇怪的极端情况行为

标签 javascript internet-explorer debugging internet-explorer-8

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

以下代码抛出一个“无效的过程调用或参数”错误(特别是最后一行抛出错误):

var p = document.createElement("p");
var holder = Element.prototype.appendChild;
holder.apply(document.body, [p]);

这很奇怪,因为我已经在 IE8 的其他网站上尝试过它,而且效果很好。我尝试使用 .call 而不是 .apply,甚至将对原始 appendChild 方法的引用存储到 Element 上的另一个变量 原型(prototype),但是这两种尝试都抛出了同样的错误。

这是什么原因造成的?

最佳答案

编辑

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

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

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

关于 Internet Explorer,选项 chrome=1 创建一个 Google Content Frame (GCF) 将强制页面以严格模式运行。由于使用 XHTML 的 doctype header ,comcast.com 处于严格模式。

There are various ways to enter document modes in IE

页面处于严格模式的最终结果是呈现表面在 document.documentElement 处变得可用。此代码将在查看区域的底部附加文本和一段:

var p = document.createElement("p");
p.innerHTML = "APPEND";
var holder = Element.prototype.appendChild;
holder.apply(document.documentElement, [p]);

我做了这个 fiddle 来测试这个行为:http://jsfiddle.net/LAkQk/

我首先决定在多个浏览器中测试这种行为。

在 chrome、firefox、safari 和 IE8 中运行没有错误。

请注意,要在 ie8 上测试此 fiddle (或任何真正的 fiddle ),您必须使用 /embedded 然后单击“结果”。

因此,让我们首先确认这些网站上存在导致冲突的内容。


我能够在 bestbuy.com 上使用 IE8 重复错误,并确认它在 google.com 上确实有效

但是,这不是applyappendChild 的问题。传递 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]);
})()

也许是因为他们的插件之一附着在 body 上。有趣的是,这可以在 bestbuy.com 的 ie 控制台上运行

$("body").append('<p>Append!</p>');

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

关于javascript - BestBuy 网站上 Internet Explorer 8 中非常奇怪的极端情况行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329446/

相关文章:

PHP:索引数组中索引的真正含义是什么?

java - movzbl 如何与寄存器值 0xffffffffffffffff 交互?

javascript - 执行这个 PHP 程序?

javascript - Angular 创建具有动态属性的模型

javascript - 为什么我在这里看到 "origin is not allowed by Access-Control-Allow-Origin"错误?

internet-explorer - 为什么 IE 无法显示 UTF-8 编码的文本?

javascript - 为什么我不能在某些 Jetpack 代码处设置断点?

jquery - 使用 jQuery 隐藏/显示后在 IE 中不可点击/可选择/可聚焦的元素

html - 如何专门为 Internet Explorer 和 Edge 设置一个 css?

c - 通过返回的指针访问函数静态结构时出现段错误