如何解决'FB未定义'?

Rau*_*net 32 javascript facebook

有时我在加载http://connect.facebook.net/en_US/all.js时遇到"FB未定义"问题

我意识到问题是因为有时我的网站只是没有加载该文件.所以它什么都没有,而FB对象确实不存在.

我的解决方案是在发生这种情况时阻止我的用户,所以我在JavaScript中尝试了以下代码但似乎没有工作:

if (FB) {/*run the app*/} else {/*alert the user*/}
if (FB!==false) {/*run the app*/} else {/*alert the user*/}
if (FB!='undefined') {/*run the app*/} else {/*alert the user*/}
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答!

ifa*_*our 77

我认为你应该解决主要问题,哪个解决方案由Facebook提供(异步加载SDK):

您应该在要加载它的每个页面上的开始标记之后直接插入它:

<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId      : 'your-app-id',
      xfbml      : true,
      version    : 'v2.1'
    });
  };

  (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/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>
Run Code Online (Sandbox Code Playgroud)

文档:

Facebook SDK for JavaScript没有任何需要下载或安装的独立文件,而只需要在HTML中包含一小段常规JavaScript,它们会将SDK异步加载到您的页面中.异步加载意味着它不会阻止加载页面的其他元素.

更新:使用文档中的最新代码.


Rob*_*ine 16

假设FB是包含Facebook对象的变量,我会尝试这样的事情:

if (typeof(FB) != 'undefined'
     && FB != null ) {
    // run the app
} else {
    // alert the user
}
Run Code Online (Sandbox Code Playgroud)

为了测试普通旧JavaScript中未定义的内容,您应该使用"typeof"运算符.您显示的示例只是将它与字符串'undefined'进行比较,将评估为false,除非您的FB对象确实包含字符串'undefined'!

另外,您可能希望使用各种工具,如Firebug(在Firefox中),看看您是否可以找出Facebook文件未加载的原因.


小智 11

我猜你错过了;在结束的大括号}上放置分号window.fbAsyncInit = function() { ... };

  • Javascript 中通常不需要分号。您唯一需要它们的情况是,如果您将 2 个可以用分号分隔的语句放在同一行上。假设自提问者发布以来代码没有改变,他的代码对我来说看起来不错。 (2认同)

小智 9

对于仍然有这个FB错误的人,我使用这个厚脸皮修复这个问题.

而不是http://connect.facebook.net/en_US/all.js,我使用HTTPS并将其更改为https://connect.facebook.net/en_US/all.js ,它解决了我的问题.