2011-03-15 28 views
5

我需要能够确定何时创建一个对象(不是DOM元素 - 一个JavaScript对象)。注意房地产创建活动?

An answer to this question有一些非常有用的代码来创建可观察的属性,所以你可以在属性改变时触发一个函数。

在我的情况下,我需要做一些事情,当创建对象/属性,而不是现有的属性更改,我对这些问题的有限理解并没有帮助我找出是否或如何使用该代码来做到这一点经过多次眯眼。

情况是:页面加载一堆脚本。一些脚本创建由其他脚本需要的东西,e.g:

ThisStuff = (function() { 
    // blah blah 
    return self; 
}()); 

一些其他的代码需要初始化这个ThisStuff,只要它是可用,DOM加载完成后,这可能是。用户实际上并不需要ThisStuff,因此无论何时脚本加载完成都会发生。所以我想沿着线做一些事情:因为建筑

$(document).ready(function() { 
    wheneverIsAvailable(window,'ThisStuff', function(object) { 
     object.init(args); 
    }) 
}); 

我知道有其他的解决方案,这个问题(改变脚本命令,或加载脚本需求),但这些都是困难的。所以我只对与其他解决方案相比的方式感兴趣。如果jQuery提供了一些这样的功能,那也可以,因为我正在使用它。

回答

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); 
+0

我怎么能不喜欢这个?我希望有一种非定时的方式可以轻松完成,但不是什么大问题。 – 2011-03-15 21:23:43

+0

@jamietre:我不喜欢那些黑客,但定时器通常工作整齐。而且,在我看来这很容易。 – pimvdb 2011-03-15 21:25:59

+0

为了好玩,我实际上已经自己写了它,然后用代码更新它,它在这里:http://jsfiddle.net/hpw8Y/3/ ..在很多方面类似,但我无法弄清楚我的是否会实际上工作。我无法理解的是,你用一个数组来做这件事,当它最终成功时,我的'obj'还会存在吗?虽然有一个改进,但你的:不要启动计时器,除非你必须:) – 2011-03-15 22:23:39

0

这有点牵强,但它可能工作。

您需要使用knockoutjs,一个JavaScript库。这很棒,但建立的目的稍有不同。

反正它有一个dependentObservable事物,它允许在某个值发生变化时触发一个事件。现在我知道你想创建,但你可以检查你的变量是否保存任何值(除了你最初提供的),如果是,那么考虑初始化。

让我知道你是否觉得这听起来可行。