现在FB.ensureInit()的替代品是什么?

ser*_*erg 8 facebook

我以异步方式加载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>
Run Code Online (Sandbox Code Playgroud)

我如何知道它何时被初始化?FB.ensureInit()在API初始化之前,什么是阻止运行封闭代码的方法的替代品?

Jaw*_*awa 8

当您加载Facebook的脚本时,它将执行window.fbAsyncInit,您已经在脚本中执行.如果将方法调用作为最后一行包含在该方法中,则可以确保已初始化FB.

上面的代码变成了

window.fbAsyncInit = function() {
  FB.init({appId: 'your app id', status: true, cookie: true,
           xfbml: true});
  afterInit();
};
Run Code Online (Sandbox Code Playgroud)

您还可以定义自己的fbEnsureInit,它像以前一样工作并使用信号量而不是方法调用:(最初来自另一个答案.)

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(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

Connect wiki的性能提示中描述了另一种方式.此方法检查脚本的状态,并在加载脚本时执行回调.

因此,在上面的代码中,在附加脚本之前插入以下代码:

script.onload = script.onreadystatechange = function() {
  if ( !done && (!this.readyState || this.readyState == "loaded" ||
       this.readyState == "complete") ) {
    done = true;
    afterInit();
  }
};
Run Code Online (Sandbox Code Playgroud)

afterInit加载脚本时将调用该方法.