我目前在 Facebook 的 FacePile 代码中遇到错误,我对原因感到困惑。
facepile.php 加载一个脚本,除其他外,该脚本具有以下行( pretty-print 时):
...
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]';
};
...
我在 if (!Date.now)
部分收到一条错误消息,提示“SCRIPT5009:‘Date’未定义”。在该点附近进行调试会发现 Date
、Array
、Object
、Function
等都是未定义的。
呃……怎么样? window
存在,document
(尽管 document.body
为 null)和一些其他对象也存在,但大量预定义对象不存在吨。 IE 的早期版本似乎没有这个问题,其他任何浏览器也没有,但是运行 IE9 的多台机器(包括一个干净的 VM)都有同样的问题。
我怀疑我对此无能为力,但我非常很好奇这是怎么发生的/潜在的问题是什么。有谁知道,或者他们能告诉我一些可能有用的东西吗?
-- 编辑:
在发布这个问题之前,我找到了这个网站:http://www.guypo.com/technical/ies-premature-execution-problem/
虽然看起来(现在仍然如此)它可能是问题的根源,但我无法在任何更小的情况下复制它。我尝试过的所有组合仍然定义了日期等;这不足为奇,否则我相信其他人会看到更多 IE 问题。
最佳答案
如果您在第一个点使用 javascript 调试器单步执行,则任何 JS 都会运行。同时为日期/数组等添加一个 watch ,并注意它何时变为空。可能会很慢而且费力,但我不明白为什么它不起作用。
关于javascript - 在 FacePile 加载的 javascript 中,IE9 中的“日期”未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695099/