我目前在Facebook的FacePile代码中遇到一个错误,我对原因感到困惑。
facepile.php加载一个脚本,其中包括以下行(当打印得很漂亮时):
...
o = document.createElement('script');
o.src = l[n];
o.async = true;
o.onload = h;
o.onreadystatechange = function() {
if (o.readyState in c) {
h();
o.onreadystatechange = null;
}
};
d++;
a.appendChild(o);
...
(a==document.body,d++在此无关)
这段代码加载了一个src=http://static.ak.fbcdn.net/rsrc.php/v1/yW/r/pmR8u_Z_9_0.js
的脚本或类似的神秘内容(文件名偶尔会更改)。
在这个脚本中,最上面有以下几行(当打印得很漂亮时):
/*1331654128,176820664*/
if (window.CavalryLogger) {
CavalryLogger.start_js(["/8f24"]);
}
window.__DEV__ = window.__DEV__ || 0;
if (!window.skipDomainLower && document.domain.toLowerCase().match(/(^|.)facebook..*/))
document.domain = window.location.hostname.replace(/^.*(facebook..*)$/i, '$1');
function bagofholding() {
}
function bagof(a) {
return function() {
return a;
};
}
if (!Date.now)
Date.now = function now() {
return new Date().getTime();
};
if (!Array.isArray)
Array.isArray = function(a) {
return Object.prototype.toString.call(a) == '[object Array]';
};
...
我得到一个错误,上面写着"SCRIPT5009:‘日期’未定义",就在if (!Date.now)
部分。接近该点的调试显示Date
、Array
、Object
、Function
等都是未定义的。
呃。。。怎样window
存在,document
(尽管document.body
为空)和其他一些对象也存在,但许多预定义的对象都不存在。早期版本的IE似乎没有这个问题,其他浏览器也没有,但运行IE9的多台机器(包括一个干净的VM)都有同样的问题。
我怀疑我能对此做些什么,但我非常好奇这是怎么发生的/潜在的问题是什么。有人知道吗,或者他们能给我指一些可能有帮助的东西吗?
--编辑:
在发布这个问题之前,我发现了这个网站:http://www.guypo.com/technical/ies-premature-execution-problem/
虽然它看起来(现在仍然如此)可能是问题的根源,但我无法在任何较小的情况下复制它。我尝试过的所有组合仍然有日期等定义;这并不太令人惊讶,否则我相信其他人会看到IE出现更多问题。
如果在运行任何JS的第一点使用javascript调试器进行调试。同时为Date/Array等添加一个手表,并注意它何时变为null。可能很慢很费力,但我不明白为什么它不起作用。
您可能需要尝试在document.ready函数中添加脚本。换言之,确保FB脚本仅在DOM准备好之后才被处理。但是,根据你给Guy‘s Pod的链接(顺便说一句,这是一篇很棒的文章),你认为IE正在下载并提前执行脚本的说法似乎是正确的(因此,我建议添加一个包装器,以便它只在DOM就绪事件后执行)。IE9可能正在对正在执行的脚本进行沙盒处理(在文档/窗口范围之外)。