Как определить, когда функция javascript Facebook готова?

Я использовал это:

function FB_wait() {
 if (typeof FB == 'undefined') {
 window.setTimeout(FB_wait, 100);
 } else {
 more();
 }
}

Но должен быть лучший способ

window.fbAsyncInit = function() {
 FB.init({
 appId : '<!--?php echo $conf['fb']['appid']; ?-->',
 status : true, // check login status
 cookie : true, // enable cookies to allow the server to access the session
 xfbml : true // parse XFBML
 });
 FB.Canvas.setAutoResize();
 };
 (function() {
 var e = document.createElement('script');
 e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
 e.async = true;
 document.getElementById('fb-root').appendChild(e);
 }());

Это мой код инициализации.

3 ответа

Я сделал функцию window.fbReady(), которая ведет себя так же, как функция jQuery ready, в том, как будет выполняться функция, которую вы даете ей, если объект FB загружен, или добавит ее в очередь, если нет.

;(function(){
 // Function to have a list of functions to load on fbAsyncInit
 var toLoad = []
 window.fbReady = function(func){
 if( typeof func === 'function') {
 if( window.FB ) {
 func.call(window)
 } else {
 toLoad.push(func)
 }
 }
 }
 window.fbAsyncInit = function() {
 FB.init({
 appId: FACEBOOK_API_KEY,
 status: true,
 cookie: true,
 xfbml: true
 })
 // Execute all the fbAsyncInit functions
 toLoad.forEach(function(func){
 func.call(window)
 })
 };
})();
(function(d, debug){
 var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
 if (d.getElementById(id)) {return;}
 js = d.createElement('script'); js.id = id; js.async = true;
 js.src = "//connect.facebook.net/en_US/all" + (debug ? "/debug" : "") + ".js";
 ref.parentNode.insertBefore(js, ref);
}(document, /*debug*/ false));


Вы должны вставить любую функцию FB внутри window.fbAsyncInit, но НЕ в FB.init(), потому что она возвращает в качестве параметра только массив параметров. Ваш код должен выглядеть так:

window.fbAsyncInit = function() {
 FB.init({
 appId : '<!--?php echo $conf['fb']['appid']; ?-->',
 status : true, // check login status
 cookie : true, // enable cookies to allow the server to access the session
 xfbml : true // parse XFBML
 });
 // at this level, the FB library is ready
 FB.Canvas.setAutoResize();
 FB.getLoginStatus(function(resp){ console.log(resp) });
 FB.any_fb_function();
 (function() {
 var e = document.createElement('script');
 e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
 e.async = true;
 document.getElementById('fb-root').appendChild(e);
 }());
};

licensed under cc by-sa 3.0 with attribution.