我需要能够确定何时创建对象(不是DOM元素 - 一个javascript对象)。
An answer to this question有一些非常有用的代码用于创建可观察属性,因此您可以在属性更改时触发函数。
在我的情况下,我需要在创建对象/属性时执行某些操作,而不是更改现有属性,并且我对此类事项的有限理解无法帮助我确定是否或如何使用该代码执行此操作之后眯着眼睛。
情况是:页面加载了一堆脚本。一些脚本创建了其他脚本所需的东西,例如:
ThisStuff = (function () {
// blah blah
return self;
} ());
其他一些代码需要初始化此ThisStuff
,只要它可用,这可能是在DOM完成加载之后。用户实际上并不需要ThisStuff
,所以只要脚本加载完成就可以了。所以我想按照以下方式做点什么:
$(document).ready(function() {
wheneverIsAvailable(window,'ThisStuff', function(object) {
object.init(args);
})
});
我意识到此问题还有其他解决方案(更改脚本顺序,或按需加载脚本),但由于体系结构,这些很难。所以我只对与其他解决方案相比的方法感兴趣。如果jQuery提供了一些这样的功能,那我也可以使用它。
答案 0 :(得分:2)
您可以每秒检查一次setInterval
来查看特定变量。您可以使用obj.hasOwnProperty(prop)
检查是否创建了它。创建它时,您将调用该函数,并清除间隔。
它可能很脏,但它也可能适合你。
修改:我为您编写了此代码:http://jsfiddle.net/jhXJ2/2/。它还支持将其他参数传递给函数。
window.__intervals = [];
function wheneverIsAvailable(obj, prop, func) {
var id = (Math.random()+"").substring(2);
var args = arguments;
window.__intervals[id] = window.setInterval(function() {
if(obj.hasOwnProperty(prop)) {
window.clearInterval(window.__intervals[id]);
func(Array.prototype.slice.call(args, 3));
// Call function with additional parameters passed
// after func (from index 3 and on)
}
}, 1000/ 50);
}
wheneverIsAvailable(window, 'test', function() {
alert(arguments[0]);
}, 'Woot!');
window.setTimeout('window.test = 123', 1000);
答案 1 :(得分:0)
这有点牵强,但它可能会奏效。
你需要使用knockoutjs,一个javascript库。它很棒但是它的目的略有不同。
无论如何,它有一个dependentObservable事物,它允许在某个值发生变化时触发事件。现在我知道你想要创建,但你可以检查你的变量是否包含任何值(除了你最初提供的值),如果是,则考虑初始化。
如果您认为这听起来可行,请告诉我。