我在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]);
这很奇怪,因为我已经在IE8的其他网站上尝试了它,它就像一个魅力。我尝试使用.call
代替.apply
,甚至将原始appendChild
方法的引用存储到Element
原型上的另一个变量,但这两个尝试都是相同的错误。
造成这种情况的原因是什么?
答案 0 :(得分:9)
修改强>
“什么样的代码可能会导致此错误?”
由于页面处于严格模式,似乎该错误与document.body
不可用有关。作为指令的结果,该模式在bestbuy中输入:
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
对于Internet Explorer,选项chrome=1
创建 Google Content Frame (GCF) 将强制页面以严格模式运行。 comcast.com使用XHTML
作为其doctype标题的严格模式。
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]);
为了测试这种行为,我做了这个小提琴: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>');
我查看了一些插件,但找不到导致重载或冲突的确切代码行,但它必须在那里,更可能是因为嗅探用户代理。
答案 1 :(得分:1)
调试器说“Travis”代码“'元素'未定义”,我加载页面时收到的唯一JS异常是“hasAttribute”是一种不支持的方法。两者都发生在IE8以兼容模式(文档模式:IE7标准)加载页面时,但可能我加载了与您不同的页面:您的代码使用Element,因此异常将与Travis的代码相同。 这是答案:
What's IE take on HTMLDocument and HTMLElement
IE7中没有“元素”。