【问题标题】:FB.init has already been calledFB.init 已被调用
【发布时间】:2012-05-12 01:16:56
【问题描述】:

我正在构建 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')
  })
}

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

【问题讨论】:

标签: facebook facebook-opengraph


【解决方案1】:

从您将参数传递给js.src 的那一刻起,如#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";

希望这会有所帮助。

【讨论】:

  • 认为这是正确的答案,有这个问题的其他人可以确认吗?
  • 缇欧,我觉得是这样。我也可以通过摩擦力请求吗?
  • @potomok,如果您想在 SDK 初始化后立即渲染 xfbml 标签,只需在您的 FB.init 函数中添加参数 xfbml : true
  • 这是正确答案,OP 是否可以将其标记为这样以帮助未来的用户?这正是我想要的。
  • 更新:您应该根据新文档将all.js 替换为sdk.js
【解决方案2】:

如果您确实需要多次调用 init,您可以这样做:

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

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

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

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

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

FB.XFBML.parse();

【讨论】:

  • Dmitrij,我每页只调用一次 init(),但是看起来 facebook 希望在每次 iframe 加载时只调用一次 init(),或者它会像 Pawel 假设的那样自动调用。如果第一种情况是有效的,那么看到代码真的很有趣
【解决方案3】:

我也遇到过这个问题。我只是删除了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'));

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

【讨论】:

  • 好吧,你如何传递channelUrl和frictionlessRequests = true?
  • 我没有,在我的情况下这不是问题,因为我在现场使用此代码。但是,iframe 应用程序可能会出现问题。也许尝试在js路径中的“#”之后添加另一个参数? (只是一个想法,我没有测试过)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多