【问题标题】:Watch for a property creation event?关注财产创建事件?
【发布时间】:2011-03-15 19:05:14
【问题描述】:

我需要能够确定何时创建对象(不是 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 提供了一些这样的功能,那也很好,因为我正在使用它。

【问题讨论】:

    标签: javascript jquery javascript-events


    【解决方案1】:

    您可以让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);
    

    【讨论】:

    • 我怎么能不喜欢呢?我希望有一种非计时器的方法可以轻松做到这一点,但没什么大不了的。
    • @jamietre:我也不喜欢这些技巧,但计时器通常工作得很好。另外,我认为这很容易。
    • 为了好玩,我实际上是在你用代码更新它之前自己写的,它在这里:jsfiddle.net/hpw8Y/3 .. 在许多方面相似,虽然我不知道我的是否真的可以工作.我无法理解的是,你用一个数组来做这个,当它最终成功时,我的obj 是否仍然存在?不过,与您的相比有一个改进:除非您必须这样做,否则不要启动计时器:)
    • 你的确实很好用。恐怕我不明白你所说的“当它最终成功时,obj 仍然存在”是什么意思。无论如何,我的解决方案总是启动我猜的计时器,从而使用更少的带宽:o)
    • 谢谢,它的灵感来自您的回答。必须将hasOwnProperty 更改为object[property],IE6 window 对象显然没有方法hasOwnProperty,太棒了。我的意思是仍然存在,在这种情况下我不完全理解 JS 中的对象范围/持久性,我认为连续使用两次会遇到问题?在前一个“完成”之前的第二个电话不会使用相同的obj吗?
    【解决方案2】:

    这有点牵强,但它可能会奏效。

    您将需要使用 knockoutjs,一个 javascript 库。它很棒,但目的略有不同。

    无论如何,它有一个dependentObservable 的东西,它允许在某个值发生变化时触发一个事件。现在我知道您想要创建,但您可以检查您的变量是否包含任何值(除了您最初提供的值),如果是,则考虑对其进行初始化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-27
      • 2016-10-23
      • 2012-10-08
      • 1970-01-01
      • 2011-08-03
      • 2018-11-01
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多