监视属性创建事件?

6 浏览
0 Comments

监视属性创建事件?

我需要能够确定一个对象何时被创建(不是DOM元素,而是JavaScript对象)。\n这个问题的答案中有一些看起来非常有用的代码,用于创建可观察的属性,这样当属性发生变化时,可以触发一个函数。\n在我的情况下,我需要在对象/属性被创建时执行某些操作,而不是现有属性发生变化,对于这个问题,我的有限理解并没有帮助我弄清楚是否可以使用那些代码来实现这个目标,我已经仔细研究了很久。\n情况是这样的:页面加载了一堆脚本。其中一些脚本创建了其他脚本需要的东西,例如:\n

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

\n其他一些代码需要在ThisStuff可用时进行初始化,这可能是在DOM加载完成之后。用户实际上不需要立即使用ThisStuff,所以它可以在脚本加载完成后随时发生。所以我想做的是:\n

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

\n我意识到解决这个问题还有其他方法(改变脚本顺序或按需加载脚本),但由于架构的原因,这些方法都很困难。所以我只对解决这个问题的方法感兴趣,而不是其他解决方案。如果jQuery提供了这样的功能,那也可以,因为我正在使用它。

0
0 Comments

这是有些牵强的,但可能会起作用。

你需要使用knockoutjs,一个JavaScript库。它很棒,但是为了稍微不同的目的而构建。

无论如何,它有一个dependentObservable的功能,可以在某个值发生变化时触发事件。现在我知道你想要在创建时触发,但你可以检查你的变量是否持有任何值(除了最初提供的值),如果是的话,就认为它已经初始化了。

如果你认为这听起来可行,请告诉我。

0
0 Comments

问题的原因是想要在特定变量被创建时触发一个函数,但是没有直接的方法可以实现。解决方法是使用setInterval函数设置一个定时器,检查变量是否被创建,并使用obj.hasOwnProperty(prop)方法进行检查。当变量被创建时,调用函数并清除定时器。

以下是实现上述解决方法的代码示例:

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

这段代码使用了wheneverIsAvailable函数来监视window对象中的test变量是否被创建。当test变量被创建时,弹出一个提示框显示传入的参数'Woot!'。

这个解决方法可能有些麻烦,但在大多数情况下应该能正常工作。

0