我遇到了这个问题。我有一个脚本来检查变量是否存在,因为有些脚本是异步加载的,比如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);
}
看起来像这样
if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name))
不起作用。 IE抛出错误 eval(姓名) - 例如如果name ='FB',它表示它不能评估未定义的'FB'。
如果window.hasOwnProperty(name)
, name == 'twttr.widgets'
无效。
是否存在通过var名称存在var的通用和跨浏览器检查?
答案 0 :(得分:6)
首先,您不需要eval
(您几乎从不这样做),您可以使用字符串和括号表示法索引JavaScript对象,例如:
window['FB'];
或
name = 'FB';
foo = window[name];
所以检查:
if (typeof window[name] === "undefined")
...除了不区分根本不存在的属性,或者存在但具有值undefined
的属性。
或
if (name in window)
...但是检查原型和对象。不过,这对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
}
......或者那种效果。
答案 1 :(得分:2)
我一直只是用过:
if (window[name]) {
return 'it exists';
} else {
return 'nope';
}
编辑:这是有效的,因为如果窗口[名称]不存在,则if确定undefined
为假。
答案 2 :(得分:0)
您正在寻找的是:
if ('key' in object)
所以在你的例子中
if (name in window)
答案 3 :(得分:0)
要解决twttr.widgets
以及twttr
,请执行以下操作:
var parts = name.split( '.' )
, aVar = window;
while( parts.length ){
aVar = aVar[ aVar.shift() ];
return setTimeout( ... );
}
// aVar will now be your resolved variable
return callback();