旧的JS SDK有一个名为FB.ensureInit的函数。新的SDK似乎没有这样的功能……如何确保在api完全启动之前不进行api调用?
我在每个页面的顶部都包含了这样的内容:
<div id="fb-root"></div>
<script>
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);
}());
</script>
发布于 2012-07-23 16:15:21
这是一个解决方案,如果你使用jquery和Facebook异步延迟加载:
// listen to an Event
$(document).bind('fbInit',function(){
console.log('fbInit complete; FB Object is Available');
});
// FB Async
window.fbAsyncInit = function() {
FB.init({appId: 'app_id',
status: true,
cookie: true,
oauth:true,
xfbml: true});
$(document).trigger('fbInit'); // trigger event
};
发布于 2013-07-08 11:47:15
另一种检查FB是否已初始化的方法是使用以下代码:
ns.FBInitialized = function () {
return typeof (FB) != 'undefined' && window.fbAsyncInit.hasRun;
};
因此,在页面就绪事件中,您可以使用setTimeOut检查ns.FBInitialized并将事件推迟到以后的阶段。
发布于 2014-06-17 03:09:45
虽然上面的一些解决方案有效,但我想我应该发布我们的最终解决方案-它定义了一个' ready‘方法,它将在FB初始化并准备好运行时立即触发。与其他解决方案相比,它的优点是在FB准备好之前或之后都可以安全地调用。
它的使用方法如下:
f52.fb.ready(function() {
// safe to use FB here
});
这是源文件(请注意,它是在'f52.fb‘命名空间中定义的)。
if (typeof(f52) === 'undefined') { f52 = {}; }
f52.fb = (function () {
var fbAppId = f52.inputs.base.fbAppId,
fbApiInit = false;
var awaitingReady = [];
var notifyQ = function() {
var i = 0,
l = awaitingReady.length;
for(i = 0; i < l; i++) {
awaitingReady[i]();
}
};
var ready = function(cb) {
if (fbApiInit) {
cb();
} else {
awaitingReady.push(cb);
}
};
window.fbAsyncInit = function() {
FB.init({
appId: fbAppId,
xfbml: true,
version: 'v2.0'
});
FB.getLoginStatus(function(response){
fbApiInit = true;
notifyQ();
});
};
return {
/**
* Fires callback when FB is initialized and ready for api calls.
*/
'ready': ready
};
})();
https://stackoverflow.com/questions/3548493
复制相似问题