Facebook Javascript SDK Проблема: «FB не определен» - PullRequest
39 голосов
/ 29 декабря 2010

Следующий код, скопированный из документации 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

У меня нет проблем с SDK в Firefox или Safari, только Chrome.

Ответы [ 19 ]

51 голосов
/ 07 февраля 2011

Я видел случай, когда Chrome установил WidgetBlock, который блокировал скрипт Facebook.Результатом было именно это сообщение об ошибке.Убедитесь, что вы отключили все расширения, которые могут помешать.

49 голосов
/ 27 января 2012

Таким образом, проблема в том, что вы не ожидаете завершения инициализации.Это приведет к случайным результатам.Вот что я использую.

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
}
24 голосов
/ 03 ноября 2012

Эта ошибка также появится, если вы опустите точку с запятой после определения 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') рассматривается как вызов только что определенной функции.

5 голосов
/ 19 апреля 2011

Я тоже столкнулся с этой проблемой, и то, что решило ее, не имеет ничего общего с Facebook, но предыдущий скрипт, который я включил, был в плохом состоянии

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

Я изменил его на

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

И это работает ...

Понятно ... надеюсь, мой опыт поможет другим, застрявшим в этом, который сделал почти все, но все еще не может заставить его работать ...

О, Боже ... ^^

4 голосов
/ 29 декабря 2010

Попробуйте асинхронную загрузку: 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>
4 голосов
/ 21 февраля 2012

У меня был очень грязный код, который загружал javascript от Facebook через AJAX, и я должен был убедиться, что файл js полностью загружен, прежде чем вызывать FB.init мне кажется, это работает

    $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 и выполнения функции обратного вызова onLoad javascript. это гораздо меньше, чем создание EventListener onLoad для блока, который в конце концов не очень хорошо работал на IE6, 7 и 8

3 голосов
/ 28 апреля 2011

AdBlock блокирует API-скрипты Facebook JS, потому что это связано с Facebook Connect, что часто раздражает.

2 голосов
/ 07 декабря 2012

Используйте 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);
2 голосов
/ 08 ноября 2011

Не уверен, что у вас все еще есть эта проблема, но у меня была та же самая проблема, оказалось, что у меня запущено расширение, которое блокировало Facebook от всех веб-сайтов, которые не являются Facebook.Отключил, сработало!

1 голос
/ 26 мая 2011

У меня была та же проблема, и единственное решение, которое я нашел, было поместить все, что использовало оператор FB, в скрипт инициализации, я также использовал асинхронную загрузку, поэтому функция обратного вызова следует за всем, что нуждается в FB. У меня есть общая страница, динамически загруженная с помощью php, поэтому многие части нуждаются в различных функциях Facebook, управляемых php, если заявления, которые делают все немного запутанным, но работают !. если я попытаюсь извлечь какое-либо объявление FB из загрузочного скрипта, то firefox покажет сообщение «FB не определено». Надеюсь, это поможет во всем.

...