Facebook Javascript SDK问题:“FB没有定义”

下面的代码从这里的Facebook文档复制而来,在Chrome中并不适合我。

<div id="fb-root"></div> <script src="http://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 }); </script> 

在Javascript控制台中,我得到:

 Uncaught ReferenceError: FB is not defined 

我在Firefox或Safari中没有任何问题,只是Chrome。

我看到了Chrome安装了阻止Facebook脚本的WidgetBlock的情况。 结果正是这个错误信息。 确保禁用可能会干扰的任何分机。

所以这个问题实际上是你不等待init的完成。 这将导致随机结果。 这是我使用的。

 window.fbAsyncInit = function () { FB.init({ appId: 'your-app-id', cookie: true, xfbml: true, oauth: true }); // *** here is my code *** if (typeof facebookInit == 'function') { facebookInit(); } }; (function(d){ var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js"; d.getElementsByTagName('head')[0].appendChild(js); }(document)); 

这将确保一旦一切都被加载,函数facebookInit可用并执行。 这样你就不必每次都要复制init代码。

 function facebookInit() { // do what you would like here } 

如果在fbAsyncInit定义之后省略分号,也会出现此错误。

 window.fbAsyncInit = function() { FB.init({ appId: 'YOUR APP ID', status: true, cookie: true, xfbml: true }); //do stuff }; //<-- semicolon required! 

没有分号,情况就和这个较短的例子一样:

 var x = function () { console.log('This is never called. Or is it?'); } ('bar'); 

该函数被调用,因为没有分号('bar')部分被视为对刚刚定义的函数的调用。

我也遇到过这个问题,解决这个问题和Facebook没有任何关系,但是之前的脚本我把它包含进去了

 <script type="text/javascript" src="js/my_script.js" /> 

我改变了

 <script type="text/javascript" src="js/my_script.js"></script> 

它的工作原理

Weew …希望我的经验可以帮助别人坚持这一点,几乎做了一切,但仍然无法工作…

哦,男孩… ^^

尝试asynchronous加载: http : //developers.facebook.com/docs/reference/javascript/fb.init/

 <div id="fb-root"></div> <script> window.fbAsyncInit = function() { 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 }); }; (function() { var e = document.createElement('script'); e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; e.async = true; document.getElementById('fb-root').appendChild(e); }()); </script> 

我有一个非常凌乱的科迪,通过AJAX加载Facebook的JavaScript,我不得不确保在调用FB.init之前,js文件已经被完全加载,这似乎适用于我

  $jQuery.load( document.location.protocol + '//connect.facebook.net/en_US/all.js', function (obj) { 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 }); //ANy other FB.related javascript here }); 

这段代码使用jquery来加载javascript,并执行JavaScript的函数callbackonLoad。 它比创build一个onLoad事件监听器的混乱less得多,它最终在IE6,7和8上不能很好地工作

AdBlock阻止Facebook JS API脚本,因为它涉及到Facebook连接,这往往是烦人的。

不知道你是否仍然有这个问题,但我只是有同样的问题,原来我有一个扩展运行,阻止所有不是Facebook的网站Facebook。 禁用它,工作!

使用setTimeout,因为有时FB.init需要一些时间来声明

 function testAPI() { console.log('Welcome! Fetching your information.... '); FB.api('/me', function(response) { console.log('Good to see you, ' + response.name + '.'); }); } function login() { FB.login(function(response) { if (response.authResponse) { testAPI(); } else { // cancelled } }); } setTimeout(function() { login(); },2000); 

尝试加载您的脚本在头部分。 此外,如果你在一些像document.ready这样的调用中定义你的脚本,如果你在body部分定义了这些脚本,那将会更好

我有同样的问题,我发现唯一的解决scheme是将所有使用FB语句的内容放在init脚本中,我也使用asynchronous加载,所以callback函数是在所有需要FB的东西之后。 我有一个共同的页面dinamycally加载了PHP这么多的部分需要不同的Facebookfunction控制的PHP如果声明使一切都有点混乱,但工作! 如果我尝试从加载脚本中取出任何FB声明,那么Firefox将显示“FB未定义”消息。 希望它有助于任何事情。

为了testingMattys关于FB未完成的build议,我在脚本中join了一个警告。 这导致我可以控制的延迟。 果然……这是一个时间问题。

  $("document").ready(function () { // Wait... alert('Click ok to init'); try { FB.init({ appId: '###', // App ID status: true, // check login status cookie: true, // enable cookies to allow the server to access the session xfbml: true // parse XFBML }); } catch (err) { txt = "There was an error on this page.\n\n"; txt += "Error description: " + err.message + "\n\n"; txt += "Click OK to continue.\n\n"; alert(txt); } FB.Event.subscribe('auth.statusChange', OnLogin); }); 

我有同样的问题,我find了原因。

我有avast! 杀毒软件安装在我的电脑,并要求我安装铬插件的更新。 新的avast! plugin for chrome avast! plugin for chrome具有阻止广告和跟踪的function,并且默认情况下,它会阻止Facebook访问。 我已经解决了我的问题,只是让avast! 我需要的网站的铬插件。

由于这个问题很老,我认为有些人可能和我一样,新的avast! 铬插件。

有你的解决scheme:)

你必须在窗口加载后运行你的脚本

如果你使用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> 

我有同样的问题。 解决scheme是使用core.js而不是debug.core.js

Facebook更喜欢你加载他们的SDKasynchronous,以便它不会阻止任何您需要您的页面的其他脚本,但由于iframe有可能在FB对象完全之前控制台尝试调用FB对象的方法即使FB只在fbAsyncInit函数中被调用, fbAsyncInit被创build。
尝试加载的JavaScript同步,你不应该得到错误了。 为此,您可以复制并粘贴Facebook提供的代码,并将其放置在外部.js文件中,然后将该.js文件包含在页面的<head>标记中。 如果你必须asynchronous加载他们的SDK,那么在调用init函数之前先检查FB是否被创build。

我有一个类似的问题,原来是Adblocker Pro。 一定要检查这个或其他阻塞扩展已被禁用。 由于这个原因,我在1小时30分左右失去了。 感觉像这样的小白菜;)

您是否将appId属性设置为您当前的应用程序ID?

如果您使用JQuery,请尝试将FB添加到Jquery调用中

例如

 $(document).ready(function(){ FB.Event.subscribe('auth.login', function(){ alert('logged in!'); }); }); 

为我工作