代码之家  ›  专栏  ›  技术社区  ›  serg

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

  •  8
  • serg  · 技术社区  · 16 年前

    我正在以异步方式加载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>
    

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

    1 回复  |  直到 13 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    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 维基。此方法检查脚本的状态,并在加载脚本时执行回调。

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

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

    方法 afterInit 将在加载脚本时调用。

    推荐文章