在调用FB.init()之前调用了FB.getLoginStatus()

41

我在控制台中看到了这个消息

FB.getLoginStatus() called before calling FB.init(). 

我的代码

<div id="fb-root"></div>
<script>
        // Load the SDK Asynchronously
        (function(d){
           var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
           if (d.getElementById(id)) {return;}
           js = d.createElement('script'); js.id = id; js.async = true;
           js.src = \"//connect.facebook.net/fr_FR/all.js#xfbml=1\";
           ref.parentNode.insertBefore(js, ref);
         }(document));
</script>
<div class="fb-like" data-send="false" data-layout="button_count" data-width="100" data-show-faces="false"></div>

我不明白为什么。我在整个网站中只调用了一次这个 Facebook 点赞插件。

6个回答

90

简短回答

在你的js.src URL后面添加&status=0即可消除警告,例如:

//connect.facebook.net/fr_FR/all.js#xfbml=1&status=0

详细回答

如果在散列符号(#)后提供了参数,则 Facebook 脚本在加载时将内部调用 FB.init()。 这里传递了xfbml,因此会调用FB.init()

(来源代码:此帖子发布时,http://connect.facebook.net/fr_CA/all/debug.js的第8699行)

如果未明确提供,则使用 init() 的默认参数:status 默认值为 true,这使得 FB 脚本在启动时调用 getLoginStatus(),因为该函数调用需要 app ID,所以导致了一些警告信息。

FB 社交插件不需要应用程序 ID,它们被呈现为来自facebook.com的 iframe,因此可以访问FB登录状态和cookie。

FB开发者社交插件中的 "获取代码"向导会生成一个带有xfbml参数的URL,建议将其更新为带有status=0参数。


7
如果您复制粘贴了该URL,请将'fr_FR'改为'en_US',以使用英语。以防万一有人想知道。 - Chris Frank
4
似乎对sdk.js无效。适用于新版本的FB API。 - jnbdz

1
如果您在实施解决方案后看到“无效的应用程序 ID”警告,请注意:

https://dev59.com/UWcs5IYBdhLWcg3wfEDa#16593474

然后将appId添加到您的js.src URL中,使其适用于您,即:

//connect.facebook.net/en_US/all.js#xfbml=1&status=0&appId=YOUR_APP_ID

这个 appId 的存在将自动使用基本应用程序设置调用 FB.init()。

0

在调用 FB 登录状态函数之前,您需要先调用 FB.init 函数。

    <div id="fb-root"></div>
    <script src="//connect.facebook.net/en_US/all.js"></script> 
    <script>
      FB.init({
            appId  : 'YOUR APP ID',
            status : true, // check login status
            cookie : true, // enable cookies to allow the server to access the session
            xfbml  : true,  // parse XFBML
            oauth : true
        });

    // Load the SDK Asynchronously
    (function(d){
       var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
       if (d.getElementById(id)) {return;}
       js = d.createElement('script'); js.id = id; js.async = true;
       js.src = \"//connect.facebook.net/fr_FR/all.js#xfbml=1\";
       ref.parentNode.insertBefore(js, ref);
     }(document));
  </script>

报错信息:ReferenceError: FB is not defined - Etienne
1
它报错了:FB.init已经被调用 - 这可能表示存在问题。 - Felix Eve

0

我使用了以下代码,现在它可以正常工作:

<!--[if IE]>
<script src="https://connect.facebook.net/pt_BR/all.js?xfbml=1" type="text/javascript"></script>
<![endif]-->
<script src="https://connect.facebook.net/pt_BR/all.js#xfbml=1" type="text/javascript"></script>

 <div class="fb-like"
          data-href="https://www.myurl.com" 
          data-send="true" data-layout="button_count" 
          data-width="50" data-show-faces="false"></div>

这不是异步的,而是阻塞的。 - deefour

0

警告:以下内容有些猜测。如果不行的话,我可以删除它。

我认为问题可能在于异步加载SDK但是内联Like按钮。然后,Like按钮可能会在脚本加载之前调用getLoginStatus。您可以通过注释异步加载SDK的脚本并将其作为普通脚本标记包含在页面头部来测试/验证此操作。

当然,这只是测试的简单方法。如果您可以验证它是问题所在,则“正确”的解决方法可能是确保在SDK加载完成之前不会出现Like按钮。


这很有道理,但我猜“异步”意味着“不要减慢页面渲染”。在 FB.init 之后,sdk 自己不应该调用“FB.getLoginStatus”吗? - sglessard
我刚意识到在回答之前应该先问一个重要的问题:那个消息是在页面加载时立即出现在控制台中,还是只有当您点击“赞”按钮或在某些其他时刻(例如,当“赞”按钮被渲染时)才会出现?我的假设是FB.init作为异步SDK加载的一部分被调用,并且getLoginStatus在单击或加载“赞”按钮时被调用。 - nthall
1
由于我遇到了相同的问题,我来回答一下:控制台提示:“[16:49:03,243] 在调用FB.init()之前调用了FB.getLoginStatus()。@ http://connect.facebook.net/fr_CA/all.js#xfbml=1:56” 正是在解析 HTML 代码中的“like”按钮时触发的(在文档准备就绪之前)。 - sglessard
是的,就是这样,页面一加载就可以了。 我不明白,我在 Facebook 开发者页面上找到了代码... https://developers.facebook.com/docs/guides/web/#plugins 使用 iframe 代码没有问题。 - Jon
3
“我认为问题在于异步加载SDK和Like按钮内联。” - 不,不可能。在SDK执行之前,没有喜欢的按钮 - SDK的工作是解析<div class =“fb-like”>元素并将其转换为iframe。在SDK运行之前,这只是一个无法单独工作的HTML元素。 - CBroe

0

我回答了一个类似的SO问题在这里
实际上,如果您完全看不到“赞”按钮,那么这个问题就是另一个问题的完全副本。

在我的情况下,我看到控制台错误,但是我也看到了“赞”按钮。


我也遇到了同样的问题,按照文档一步一步地做了一切,虽然看到了按钮,但仍然出现了控制台错误 FB.getLoginStatus() called before calling FB.init().。有解决方案吗? - optikfluffel
我也添加了自己的答案到那个问题中。我通过在线测试解决了它。 :) - Johny Skovdal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接