2011-06-21 48 views
6

我有一個腳本,可以在網頁的生命週期的任何階段加載。 當腳本被加載時,它必須運行一個initialize()方法。Javascript:當窗口完全加載時檢測

我想讓這個函數在「onload」事件上運行,但我不能確定這個頁面是否已經加載,即「onload」還沒有被觸發。

理想的情況下我的劇本是這樣的:

var _initialize = function() { ...}; 

if(window.LOADED) 
    _initialize(); 
else if (window.addEventListener) 
    window.addEventListener('load', _initialize, false); 
else if (window.attachEvent) 
    window.attachEvent('onload', _initialize); 

是否有這樣的window.LOADED或document.LOADED變量或類似的東西?

由於提前, 巴蒂爾

+1

你使用任何JS框架? jquery提供了幾個很棒的功能來輕鬆完成這個任務 – JMax

+0

請看@Balanivash的帖子上的評論 – Shane

+0

是不是設置一個變量onload的最簡單的答案。當腳本運行時,如果未設置變量,請添加一個onload監聽器來調用腳本。如果變量已設置,則只需調用該函數。 – RobG

回答

3

您可以使用jQuery來做到這一點。 $(document).ready()。檢查this

只需調用準備好的功能即可。然後,它會被執行一次文件被完全加載

+0

我不能:(。 _initialize方法加載腳本的依賴關係,其中之一是jQuery – Shane

+0

你可以讓jQuery獨立於函數之外並將其與頁面一起加載 – Balanivash

+0

是的,但是在相同的位置我可以用我所有的依賴關係做到這一點。我真正想做的是創建一個獨立於腳本的資源。我想如果所有的事情都可以做到,我可以假設jQuery將會在那裏,但是我想避免這種情況 – Shane

-2

你可以在頁面的結束,或只是標籤之前使用

jQuery(document).ready(); 

,它會調用,而你的網頁顯示客戶機上的左右在裝載結束時間.....

1

如果你不使用任何庫,你可以利用這個

function somelib(){ 
     this.readystate = false; //tracks the state of DOM 
     var nextcallfunc;  //stores the function to be called after DOM is loaded 

    //called by checkReady function when DOM is loaded completely 
     this.ready = function(func){ 
      // quit if this function has already been called 
      if (arguments.callee.done) return; 
      // flag this function so we don't do the same thing twice 
      arguments.callee.done = true; 
      this.readystate=true;  //make DOM load permanent 
      nextcallfunc.call();  //calls the onload handler 
    } 

    //Checks if the DOM has loaded or not 
    this.checkReady= function(func){ 
     /* for Mozilla/Opera9 */ 
     nextcallfunc = func; 

     if (document.addEventListener) { 
      document.addEventListener("DOMContentLoaded", this.ready , false); 
     } 
     /* for Internet Explorer */ 
     /*@cc_on @*/ 
     /*@if (@_win32) 
      document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>"); 
      var script = document.getElementById("__ie_onload"); 
      script.onreadystatechange = function() { 
      if (this.readyState == "complete") { 
       ready(func); // call the onload handler 
      } 
      }; 
     /*@end @*/ 

     /* for Safari */ 
     if (/WebKit/i.test(navigator.userAgent)) { // sniff 
      var _timer = setInterval(function() { 
      if (/loaded|complete/.test(document.readyState)) { 
       this.ready(); // call the onload handler 
      } 
      }, 10); 
     } 

     /* for other browsers */ 
     window.onload = this.ready; 
    } 

    } 

這也解決了跨瀏覽器的問題..

0

這是我做的(寫在CoffeeScript中):

$(window).on 'load', -> 
    window._loaded = true 

window.on_window_load_safe = (callback) -> 
    if window._loaded 
    # Since the load even already happened, if we tried to add a new callback now, it would not even 
    # get called. So just call the callback immediately now. 
    callback.call() 
    else 
    $(window).on 'load', -> 
     callback.call() 

你可以用這樣的測試:

setTimeout(-> 
    on_window_load_safe -> 
     console.debug 'on_window_load_safe called me' 
    , 2000) 
相關問題