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

Jon*_*Jon 41 facebook

我在我的控制台中收到此消息

FB.getLoginStatus() called before calling FB.init(). 
Run Code Online (Sandbox Code Playgroud)

我的代码

<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>
Run Code Online (Sandbox Code Playgroud)

我不明白为什么.在我的所有网站上,我只有一个关于这个facebook的插件.

Séb*_*ier 92

简短的回答

添加&status=0到您的js.src网址以使警告消失,即:

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

完整答案

FB.init()如果在哈希(#)符号后提供参数,则在加载时将由facebook脚本在内部调用.这xfbml是通过,所以FB.init()被称为.

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

如果没有明确提供,则使用init()的默认参数:statusarg default is true- 这使得FB脚本getLoginStatus()在启动时调用,因为该函数调用需要应用程序ID而抱怨.

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

FB开发者社交插件部分中的"获取代码"向导生成带有xfbmlparam 的URL ,应该使用status=0参数恕我直言更新.

  • 如果您复制粘贴的URL,则需要将"fr_FR"更改为"en_US"以使用英语.万一有人想知道. (7认同)
  • 似乎不适用于sdk.js. 新版本的FB api. (4认同)

nth*_*all 0

警告:下面有一些猜测。如果不合适我可以删除它。

我认为问题在于异步加载 SDK,但“Like”按钮是内联的。那么“Like”按钮可能会在脚本加载之前调用 getLoginStatus。您可以通过注释掉异步加载 SDK 的脚本来测试/验证这一点,并将其作为普通脚本标记包含在页面标题中。

当然,这只是最简单的测试方法。如果您可以验证问题所在,那么解决该问题的“正确”方法可能是确保在加载 SDK 之前“赞”按钮不会出现在页面上。

  • _“我认为问题在于异步加载 SDK,但“赞”按钮是内联的。”_ – 不,不可能是这样。在 SDK 执行之前,__is__ 没有 Like 按钮 - SDK 的工作是解析 `&lt;div class="fb-like"&gt;` 元素并将其转换为 iframe。在 SDK 运行之前,这只是一个 HTML 元素,本身不执行任何操作。 (3认同)