我以异步方式加载FB API:
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({appId: 'your app id', status: true, cookie: true,
xfbml: true});
};
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
我如何知道它何时被初始化?在初始化API之前,FB.ensureInit()
方法的替代是什么会阻止运行封闭的代码?
答案 0 :(得分:8)
1°当您加载Facebook的脚本时,它将执行您脚本中已有的window.fbAsyncInit
。如果将方法调用作为最后一行包含在该方法中,则可以确保已初始化FB。
上面的代码变为
window.fbAsyncInit = function() {
FB.init({appId: 'your app id', status: true, cookie: true,
xfbml: true});
afterInit();
};
2°您还可以定义自己的fbEnsureInit,它与以前一样工作并使用信号量而不是方法调用:(最初来自another answer。)
window.fbAsyncInit = function() {
FB.init({appId: 'your app id', status: true, cookie: true,
xfbml: true});
fbApiInitialized = true;
};
function fbEnsureInit(callback) {
if (!window.fbApiInitialized) {
setTimeout(function() { fbEnsureInit(callback); }, 50);
} else {
if (callback) { callback(); }
}
}
3° Performance tips for Connect wiki中描述了另一种方式。此方法检查脚本的状态,并在加载脚本时执行回调。
因此,在上面的代码中,在附加脚本之前插入以下代码:
script.onload = script.onreadystatechange = function() {
if ( !done && (!this.readyState || this.readyState == "loaded" ||
this.readyState == "complete") ) {
done = true;
afterInit();
}
};
加载脚本时将调用方法afterInit
。