53

我正在构建 facebook iframe 应用程序。我的应用程序被加载一次(我收到了一次签名请求),然后我使用内部域链接浏览 iframe 中的页面。我注意到我在 Chrome 和 Firefox 中都看到了这些奇怪的消息

FB.init has already been called - this could indicate a problem

我很确定这个方法只被调用一次,而且 Facebook 似乎希望我在每次应用程序加载时调用它一次(而不是每页一次)。

window.fbAsyncInit = function() {
  FB.init({
    appId: param('facebook_app_id'),
    frictionlessRequests: true,
    oauth: true,
    channelUrl: site_url('/channel.html')
  })
}

我在这里犯了什么错误(如果有的话)?

4

3 回答 3

157

从您将参数传递给js.srclike的那一刻起#xfbml=1&appId=X,FB SDK 将自动初始化,因此FB.init将尝试重新初始化。所以在您的代码中,您不必删除该FB.init函数,只需确保您没有在异步加载 JS SDK 的代码。

替换这个:

js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=X";

和 :

js.src = "//connect.facebook.net/en_US/sdk.js";

希望这可以帮助。

于 2012-05-02T20:38:40.513 回答
10

如果你真的需要多次调用 init ,你可以这样做:

FB._initialized = false;
FB.init();

但这对我来说毫无意义,我有一点不同的问题,但它也与FB.init has already been called - this could indicate a problem消息有关。

我有基于 AJAX 的网站,在每个页面加载后,我需要从从 AJAX 请求获得的 HTML 呈现 XFBML(注释,如按钮和其他):

 <div class="fb-comments" data-href="{REMOVED}" data-num-posts="5" data-width="760" colorscheme="dark"></div>

为此,您可以在需要渲染 XFBML 时运行它:

FB.XFBML.parse();
于 2012-05-02T19:38:55.700 回答
0

我也遇到过这个问题。我只是删除FB.init({...})了一部分,它开始使用以下代码:

window.fbAsyncInit = function () {
    FB.Event.subscribe('auth.logout', function () {
        // subscribe parts
    });

    // here is where fb.init() code was
};
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=X";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

我猜它现在会自动初始化代码,因此无需手动执行。现在我的代码又可以工作了。我希望这有帮助。

于 2012-05-02T19:13:09.430 回答