39

以下代码,从此处的 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 中的 SDK 没有任何问题,只有 Chrome。

4

19 回答 19

52

我看到 Chrome 安装了阻止 Facebook 脚本的 WidgetBlock 的案例。结果正是这个错误消息。确保禁用任何可能干扰的扩展。

于 2011-02-07T00:51:40.797 回答
49

所以问题实际上是你没有等待初始化完成。这将导致随机结果。这是我使用的。

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 可用并执行。这样您就不必每次要使用它时都复制初始化代码。

function facebookInit() {
   // do what you would like here
}
于 2012-01-27T01:00:17.257 回答
24

如果您在 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') 部分被视为对刚刚定义的函数的调用。

于 2012-11-02T21:40:31.473 回答
5

我也遇到了这个问题,解决它的方法与 Facebook 无关,但我之前包含的脚本格式不好

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

我把它改成

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

它有效...

Weew...希望我的经验可以帮助其他人陷入这个几乎已经完成了所有事情但仍然无法让它发挥作用的人......

哦,男孩...^^

于 2011-04-19T09:05:15.210 回答
4

尝试异步加载: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>
于 2010-12-29T19:04:02.050 回答
4

我有一个非常混乱的代码,它通过 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 的函数回调 onLoad。它比为块创建 onLoad 事件侦听器要麻烦得多,最终在 IE6、7 和 8 上效果不佳

于 2012-02-21T06:36:20.687 回答
3

AdBlock 会阻止 facebook JS api 脚本,因为它与 facebook connect 相关,这通常很烦人。

于 2011-04-28T14:20:33.877 回答
2

不确定您是否仍然遇到此问题,但我也遇到了同样的问题,结果我运行了一个扩展程序,该扩展程序阻止了 Facebook 访问所有非 Facebook 网站。禁用它,工作!

于 2011-11-08T11:27:10.513 回答
2

使用 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);
于 2012-12-06T22:14:03.520 回答
1

尝试在 Head 部分加载您的脚本。此外,如果您在以下调用下定义脚本会更好:document.ready如果您在正文部分定义了这些脚本

于 2010-12-29T19:03:55.637 回答
1

我遇到了同样的问题,我找到的唯一解决方案是将使用 FB 语句的所有内容放入 init 脚本中,我还使用了异步加载,因此回调函数位于需要 FB 的所有内容之后。我有一个用 php 进行动态加载的公共页面,因此许多部分需要由 php if 语句控制的不同 facebook 函数,这使一切都变得有些混乱,但是可以正常工作!如果我尝试从加载脚本中取出任何 FB 声明,则 firefox 会显示“FB 未定义”消息。希望它对任何事情都有帮助。

于 2011-05-26T15:38:57.023 回答
1

为了测试 Mattys 关于 FB 未完成的建议,我在脚本中添加了警报。这会导致我可以控制的延迟。果然……这是时间问题。

    $("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);
    });
于 2012-12-28T15:30:52.523 回答
1

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

我有avast!我的电脑中安装了防病毒软件,它要求我安装 chrome 插件的更新。新avast! plugin for chrome功能具有阻止广告和跟踪的功能,默认情况下,它会阻止 Facebook 访问。我已经解决了我的问题,只需在 avast 中允许 facebook!我需要的网站的 chrome 插件。

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

于 2013-11-04T17:09:25.000 回答
1

有适合你的解决方案:)

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

如果你使用 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>
于 2016-06-25T17:15:09.120 回答
0

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

于 2011-06-21T19:42:09.583 回答
0

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

于 2012-06-21T20:27:40.770 回答
0

我有一个类似的问题,结果是 Adblocker Pro。请务必检查此或其他阻止扩展是否已被禁用。由于这个原因,我损失了大约 1 小时 30 分钟。感觉自己像个菜鸟;)

于 2017-03-14T10:43:36.977 回答
-1

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

于 2011-05-20T14:02:09.693 回答
-2

如果您使用的是 JQuery,请尝试将 FB 与 Jquery 调用

例如

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

对我有用

于 2011-11-07T04:45:14.477 回答