2011-04-02 119 views
4

jQuery提供延遲執行代碼的一個非常方便的方式,直到DOM完全加載:如何延遲JavaScript函數,直到Jquery和Facebook都加載後?

$(function() { 
    dom_is_loaded(); 
}); 

Facebook的使用Javascript SDK,當異步加載,提供了一個類似的機制:

window.fbAsyncInit = function() { 
    fb_is_loaded(); 
} 

什麼的最優雅的方式來延遲代碼運行,直到DOM Facebook的SDK都已完全初始化?

回答

5

是否有一個原因,只是在做

window.fbAsyncInit = function() { 
    $(function() { 
     both_loaded(); 
    }); 
} 

不起作用?

+0

你剛纔救了我的燻肉 – 2013-11-27 15:30:20

1

可能在你fbAsyncInit功能設置標誌,並檢查它在jQuery的負載:

$(handleLoad); 
function handleLoad() { 
    if (!facebookLoaded) { 
     setTimeout(handleLoad, 10); // Or 100 or whatever 
    } 
    else { 
     // You're good to go 
     bothLoaded(); 
    } 
} 

我希望有已經有一些全球性,您可以檢查對於Facebook是否加載(我沒有使用Facebook的API )。如果沒有,你可以使用自己的標誌(最好不是全局):

(function() { 
    var fbLoaded = false; 
    window.fbAsyncInit = function() { 
     fbLoaded = true; 
    }; 

    jQuery(handleLoad); 
    function handleLoad() { 
     if (!facebookLoaded) { 
      setTimeout(handleLoad, 10); // Or 100 or whatever 
     } 
     else { 
      // You're good to go 
      bothLoaded(); 
     } 
    } 
})(); 
3

爲什麼不:

var jq_ready = false, fb_ready = false; 

function bothReady(){ 
    ... 
} 

$(function() { 
    dom_is_loaded(); 
    jq_ready = true; 
    if(fb_ready){ 
    bothReady(); 
    }  
}); 

window.fbAsyncInit = function() { 
    fb_is_loaded(); 
    fb_ready = true; 
    if(jq_ready){ 
    bothReady(); 
    }  
} 

我覺得這是比設定的間隔更清潔,並會處理這兩種情況下發生的第一次。