2011-03-16 285 views
32

有时加载http://connect.facebook.net/en_US/all.js如何解决'FB未定义'?

我已经意识到,当这个问题是因为有时我的网站只是不加载该文件我得到了“没有定义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*/} 

感谢您的回答!

回答

16

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

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

为了测试东西是未定义普通的旧JavaScript,你应该使用“typeof”运算符。只显示您将其与字符串'undefined'进行比较的示例将评估为false,除非您的FB对象确实包含字符串'undefined'!另外,您可能希望使用各种工具,如Firebug(在Firefox中)来查看您是否可以计算Facebook文件未加载的原因。

2

你和你最初的例子非常接近。你既可以使用@ jAndy的建议或:

if (typeof FB != 'undefined') 
1

如果您的脚本标记正确,那么FB不会加载到您的javascript中,这很奇怪。检查您的浏览器中是否安装了阻止您的FB Connect代码的JavaScript拦截器,广告拦截器,跟踪拦截器等。

+0

我通过改变固定它<脚本类型=” 文本/ javascript“src =”http://connect.facebook.net/en_us/all.js“> RickLeinecker 2012-09-04 18:11:26

+1

@RickLeinecker你能解释一下你已经改变了什么吗? – rAjA 2013-09-16 11:11:58

+0

rAjA他删除了脚本的异步加载,所以页面在这个脚本将被加载而不是加载其他列表的外部/内部脚本的时候等待 – nvvetal 2014-03-03 15:47:39

76

我想你应该解决的主要问题,相反,它的解决方案是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> 

documentation

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

UPDATE:使用从文档中最新的代码。

+1

感谢你的回答我终于想通了[我的问题](http://stackoverflow.com/q/6468103/7 70984)! +1 – 2011-07-28 14:05:31

11

我猜你错过了把分号;window.fbAsyncInit = function() { ... };

+0

哇,谢谢! – 2013-06-23 16:40:59

+0

分号在Javascript中通常不需要。你需要它们的唯一时间是如果你把2个语句分隔在同一行上。假设代码发布后代码没有改变,他的代码对我来说看起来很好。 – user3413723 2015-10-06 06:11:38

1

我有FB永远不会被定义。原来,我正在将函数原型化为名为“merge”的Object类和另一个名为“toArray”的函数。 这两个都搞砸了Facebook,没有错误信息,但它不会加载。

我改变了我的原型的名称,现在它的作品。嘿,如果Facebook正在打造Object的原型,我不应该被允许原型吗?

1

FB建议将异步all.js包含在body后面,以便在页面中使用FB对象时做好准备。

您还可以使用setTimeout进行人工延迟,以确保加载FB对象。例如

<script>setTimeout(function(){ 
FB.Event.subscribe('edge.create', 
function (response) { 
    alert('msg via fb'); 
});},2000); 
</script> 
0
<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> 

从文档:Facebook的SDK为JavaScript没有需要下载或安装任何独立的文件,而不是你只需要包括一小段常规的JavaScript的HTML中塔

4

有你的解决方案:)

您必须运行脚本后,窗口中加载

,如果你使用jQuery,您可以用简单的方法:

<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
     FB.init({ 
      appId  : 'your-app-id', 
      xfbml  : true, 
      status  : true, 
      version : 'v2.5' 
     }); 
    }; 

    (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> 

<script> 
$(window).load(function() { 
    var comment_callback = function(response) { 
     console.log("comment_callback"); 
     console.log(response); 
    } 
    FB.Event.subscribe('comment.create', comment_callback); 
    FB.Event.subscribe('comment.remove', comment_callback); 
}); 
</script> 
0

我有一个类似的问题,它原来是Adblocker Pro。请务必检查是否已禁用此阻止扩展或其他阻止扩展。由于这个原因,我在1小时30分钟内输了。觉得像这样的小白;)

-1
... 
</head> 
<body> 
    <!-- Load Facebook SDK for JavaScript --> 
    <div id="fb-root"></div> 
<script type="text/javascript"> 
... 

检查DIV ID = “FB-根”/ DIV “!!!运行是非常重要的

相关问题