【问题标题】:FB.init has already been called - this could indicateFB.init 已被调用 - 这可能表明
【发布时间】:2012-12-19 12:52:34
【问题描述】:

我有一个没有 SDK 的 facebook 按钮:

<fb:like href="<%= @canonical_url %>" send="" layout="button_count"></fb:like>
     <div id="fb-root"> </div>
     <script>
      // facebook recommend button
      window.fbAsyncInit = function() {
         FB.init({appId: 'myappid', status: true, cookie: true, xfbml: true});
      };
      (function() {
        // delay to simulate slow loading of Facebook library - remove this setTimeout!!
        var t = setTimeout(function() {
            var e = document.createElement('script'); e.async = true;
            e.src = document.location.protocol + '//connect.facebook.net/<%= locale_og_tag %>/all.js';
            document.getElementById('fb-root').appendChild(e);
        }, 0);
      }());
      </script>
  </div>

当我更改页面时,我不会重新加载 facebook 按钮,然后在我的 javascript 文件中运行:

if (typeof (FB) != 'undefined') {
    FB.init({ status: true, cookie: true, xfbml: true });
   } else {
    $.getScript("http://connect.facebook.net/en_US/all.js#xfbml=1", function () {
     FB.init({ status: true, cookie: true, xfbml: true });
   });
 }

但我进入控制台:

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

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 简单 - 不要调用 FB.init() 两次...而且您确实已加载 SDK - 否则您将无法调用 FB.init()
  • @fra - 我实际上应该将 VTC 视为“过于本地化”......但既然你问得这么好...... ;)

标签: facebook facebook-like


【解决方案1】:

您有三个对 init 的调用 - 两个通过 FB.init 的显式调用,以及一个通过 ../all.js#xfbml=1 的隐式调用。删除#xfbml=1 部分以及FB.inits 中的任何一个,你应该会很好。

【讨论】:

  • 顺便说一下#xfbml=1是什么意思?
  • 这是我使用的一个例子。谢谢肖恩
【解决方案2】:

好吧,你正在两次调用FB.init()...你可能想听听该错误消息的建议:P

您只需要调用一次,并且在没有加载 SDK 的情况下无法调用它,因此您必须拥有 SDK。你调用FB.init()来设置app_id、初始化时是否渲染xfbml等参数...

【讨论】:

    【解决方案3】:

    您已经使用 window.fbAsyncInit 调用了 FB.init,并且您已经在您的第一个代码块中加载了 FB 脚本。

    这意味着你应该删除第二个代码块,你应该没问题。

    【讨论】:

      【解决方案4】:

      只需将登录表单与其他页面分开即可。所以你不会多次加载 FB.init()。

      【讨论】:

        【解决方案5】:

        也许它会帮助其他人 - 像我一样 - 有类似问题但没有找到解决方案。

        Facebook 的文档具有误导性,举个例子:

        window.fbAsyncInit = function() { FB.init({ appId : '{你的应用 id}', 饼干:真的, xfbml:是的, 版本:'v7.0' }); FB.AppEvents.logPageView(); FB.getLoginStatus(函数(响应){ 控制台日志(响应); }); }; 脚本>

        但这是错误的,因为在 facebook 脚本的 url 中,已经初始化了 FB 对象(提供应用程序 ID)。

        这就是为什么需要选择方法的原因:

        • 或在不提供应用 ID 的情况下包含 facebook 脚本,然后显式调用 FB.init(..)
        • 或包含带有应用 ID 的 facebook 脚本,然后省略调用 FB.init(...)

        【讨论】:

          猜你喜欢
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多