Javascript 在百思买';s网站
我在bestbuy.com的IE8中发现了一个bug,我似乎无法理解它为什么会出现。它也出现在IE8中的comcast.com和raymourflanigan.com等网站上,但不在google.com或godaddy.com上 以下代码抛出一个Javascript 在百思买';s网站,javascript,internet-explorer,debugging,internet-explorer-8,Javascript,Internet Explorer,Debugging,Internet Explorer 8,我在bestbuy.com的IE8中发现了一个bug,我似乎无法理解它为什么会出现。它也出现在IE8中的comcast.com和raymourflanigan.com等网站上,但不在google.com或godaddy.com上 以下代码抛出一个“无效的过程调用或参数”错误(特别是最后一行抛出错误): 这是非常奇怪的,因为我在IE8的其他网站上也尝试过,而且效果很好。我尝试使用.call而不是.apply,甚至将对原始appendChild方法的引用存储到元素原型上的另一个变量,但这两次尝试都引
“无效的过程调用或参数”
错误(特别是最后一行抛出错误):
这是非常奇怪的,因为我在IE8的其他网站上也尝试过,而且效果很好。我尝试使用.call
而不是.apply
,甚至将对原始appendChild
方法的引用存储到元素
原型上的另一个变量,但这两次尝试都引发了相同的错误
这是什么原因造成的?编辑
“什么类型的代码可能导致此错误?”
错误似乎与document.body
不可用有关,因为页面处于严格模式。根据指令,百思买进入该模式:
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
我做这把小提琴是为了测试这种行为: 我首先决定在多个浏览器中测试这种行为 在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]);
})()
也许是因为他们的一个插件连接到了身体上。有趣的是,这在百思买的ie控制台上运行
$("body").append('<p>Append!</p>');
$(“body”).append(“append!”);
我查看了许多插件,找不到导致过载或冲突的确切代码行,但它肯定在那里,很可能是嗅探用户代理的结果。调试器说“'Element'未定义”对于Travis的代码,我加载页面时收到的唯一JS异常是“hasAttribute”是不受支持的方法。只有当IE8以兼容模式(文档模式:IE7标准)加载页面时,这两种情况才会发生,但我加载的页面可能与您的页面不同:您的代码使用元素,因此异常情况与Travis的代码相同。
答案如下:
IE7中没有“元素”。对我来说,这在百思买网站上运行,控制台中没有任何问题。虽然它不是IE8而是IE10中的IE8模式。@TomasKirda是的,在IE8中用虚拟机试试,让我知道它是否有效。很抱歉回避这个问题,但我不明白为什么你不简单地使用document.body.appendChild(p)@JustinMeltzer:您能提供更精确的URL引用,在哪里可以重现问题或提供演示吗?@JustinMeltzer:在JavaScript控制台中测试可能会给出错误的结果。我想起了一本关于JavaScript的书和另一篇关于书中一些错误部分的长篇评论文章。这本书的作者写了一些关于基于JavaScript控制台而不是使用JavaScript程序的web浏览器的声明。所以书中有一些错误的信息(一般来说是非常好的)。你到底有什么问题并试图解决?您需要在页面上注入一些元素吗?你写过浏览器插件吗?您是否能够创建具有相同问题的干净JSFIDLE演示?很有趣。没有意识到它是特定于
document.body
。什么样的代码可能导致此错误?你能想出解决这个错误的方法吗(同时仍然能够使用document.body
)?@JustinMeltzer-我找不到导致错误的代码。可能是拦截了函数调用,可能是iframe以某种方式被用作预防工具(不太可能),或者可能是body
在某种自定义实现的特定位置被重载。
(function(){
var p = document.createElement("p");
p.innerHTML = "APPEND";
var holder = Element.prototype.appendChild;
var d = document.getElementById("header");
holder.apply(d, [p]);
})()
$("body").append('<p>Append!</p>');