2011-03-15 27 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事物,它允許在某個值發生變化時觸發一個事件。現在我知道你想創建,但你可以檢查你的變量是否保存任何值(除了你最初提供的),如果是,那麼考慮初始化。

讓我知道你是否覺得這聽起來可行。