"Date"在 IE9 中未定义,由 FacePile 加载的 JavaScript



我目前在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)部分。接近该点的调试显示DateArrayObjectFunction等都是未定义的。

呃。。。怎样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可能正在对正在执行的脚本进行沙盒处理(在文档/窗口范围之外)。

最新更新