在FacePile加载的javascript中,IE9中未定义"日期"

Gro*_*oxx 14 javascript facebook internet-explorer-9 facebook-social-plugins

我目前在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);
...
Run Code Online (Sandbox Code Playgroud)

(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]';
  };
...
Run Code Online (Sandbox Code Playgroud)

我收到的错误是"SCRIPT5009:'日期'未定义",正好在该if (!Date.now)部分.在那一点附近调试表明Date,Array,Object,Function,等都是不确定的.

呃......怎么样? window存在,document(虽然document.body是null)和少数其他的存在,但是大量的预定义对象不存在.早期版本的IE似乎没有这个问题,也没有任何其他浏览器,但运行IE9的多台机器(包括一个干净的VM)都有同样的问题.

我怀疑我能做些什么,但我好奇这是怎么回事/底层问题是什么.有谁知道,或者他们能指出一些可能有用的东西吗?

- 编辑:

在发布此问题之前,我找到了这个网站:http://www.guypo.com/technical/ies-premature-execution-problem/

虽然它似乎(现在仍然)可能是问题的根源,但我无法在任何较小的情况下复制它.我尝试过的所有组合仍然定义了Date等; 这并不太令人惊讶,否则我肯定其他人会看到IE的更多问题.

Lee*_*lor 1

如果您在第一点使用 javascript 调试器单步执行,则任何 JS 都会运行。同时添加对日期/数组等的监视,并注意它何时变为空。可能又慢又费力,但我不明白为什么它不起作用。