1

我有一个没有 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

我该如何解决这个问题?

谢谢!

4

5 回答 5

15

您有三个对 init 的调用——两个显式调用 throughFB.init和一个隐式调用 via ../all.js#xfbml=1。删除#xfbml=1零件以及其中的任何一个FB.init,您应该会很好。

于 2012-12-19T19:17:12.830 回答
2

好吧,您FB.init()两次电话...您可能需要注意该错误消息的建议:P

你只需要调用它一次,你不能在没有加载 SDK 的情况下调用它,所以你必须有 SDK。您调用FB.init()设置参数,例如app_id,是否在xfbml 初始化期间渲染等...

于 2012-12-19T19:07:45.117 回答
1

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

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

于 2012-12-19T18:58:29.997 回答
0

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

于 2015-05-10T05:13:27.267 回答
0

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

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

      <script crossorigin="anonymous" src="https://connect.facebook.net/pl_PL/sdk/debug.js#xfbml=1&version=v7.0&appId={your app id}&autoLogAppEvents=1"></script>

      <脚本>
      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(...)
于 2020-06-05T12:50:03.500 回答