我有这个问题.我有一个脚本,检查变量是否存在,因为一些脚本异步加载,如FB for Facebook或twttr for Twitter.
function whenAvailable(name, callback, interval) {
interval || (interval = 100); // ms
window.setTimeout(function() {
if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name)) {
return callback();
} else {
window.setTimeout(arguments.callee, interval);
}
}, interval);
}
Run Code Online (Sandbox Code Playgroud)
看起来像这样
if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name))
Run Code Online (Sandbox Code Playgroud)
不起作用.IE为eval(名称)抛出错误 - 例如,如果name ='FB',它表示它不能评估未定义的'FB'.
window.hasOwnProperty(name)如果不起作用name == 'twttr.widgets'.
是否存在通过var名称存在var的通用和跨浏览器检查?
首先,您不需要eval(您几乎从不这样做),您可以使用字符串和括号表示法索引到JavaScript对象,例如:
window['FB'];
Run Code Online (Sandbox Code Playgroud)
要么
name = 'FB';
foo = window[name];
Run Code Online (Sandbox Code Playgroud)
所以要检查:
if (typeof window[name] === "undefined")
Run Code Online (Sandbox Code Playgroud)
...除了不区分根本不存在的属性,或者存在但具有该值的属性undefined.
要么
if (name in window)
Run Code Online (Sandbox Code Playgroud)
...但是检查原型和对象.不过,这很好window.
window.hasOwnProperty(name)如果不起作用name == 'twttr.widgets'.
对,你必须分手:
var index = 0,
parts = name.split('.'), // doesn't handle [] notation
result;
result = window;
index = 0;
try {
while (typeof result !== "undefined" && result !== null && index < parts.length) {
result = result[parts[index++]];
}
}
catch (e) {
}
if (index < parts.length) {
// Didn't find all of it
}
Run Code Online (Sandbox Code Playgroud)
......或者那种效果.