Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

О, мальчик... ^^

Ответ 5

Попробуйте асинхронную загрузку: 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>

Ответ 6

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

Ответ 7

AdBlock блокирует скрипты facebook JS api, поскольку он связан с подключением к facebook, что часто раздражает.

Ответ 8

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

Ответ 9

Используйте 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);

Ответ 10

Попробуйте загрузить свои скрипты в разделе "Голова". Более того, будет лучше, если вы определите свои сценарии под некоторым вызовом типа: document.ready, если вы определили эти сценарии в разделе тела

Ответ 11

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

Ответ 12

Чтобы проверить предложения Mattys о том, что FB не закончил, я поставил предупреждение в script. Это вызывает задержку, которую я мог контролировать. Конечно же... это был вопрос времени.

    $("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);
    });

Ответ 13

У меня была та же проблема, и я нашел причину.

У меня есть avast! антивирус, установленный на моем компьютере, и попросил меня установить обновление для chrome plugin. Новый avast! plugin for chrome имеет функции блокировки рекламы и отслеживания, а по умолчанию он блокирует доступ к facebook. Я решил свою проблему, просто разрешив facebook в avast! chrome для сайта, который мне нужен.

Поскольку этот вопрос очень старый, я думаю, что некоторые люди могут иметь ту же причину, что и я, новый avast! хром-плагин.

Ответ 14

Есть решение для вас:)

Вы должны запустить script после загрузки окна

если вы используете 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>

Ответ 15

У меня была та же проблема. Решения заключались в использовании core.js вместо debug.core.js

Ответ 16

Facebook предпочитает, чтобы вы загружали свой SDK асинхронно, чтобы он не блокировал другие сценарии, которые вам нужны для вашей страницы, но из-за iframe есть вероятность, что консоль пытается вызвать метод на объекте FB до объект FB полностью создан, хотя FB вызывается только в функции fbAsyncInit.
Попробуйте загрузить javascript синхронно, и вы больше не должны получать ошибку. Для этого вы можете скопировать и вставить код, который предоставляет Facebook, и поместить его во внешний файл .js, а затем включить этот .js файл в тег <script> в <head> вашей страницы. Если вы должны загрузить их SDK асинхронно, проверьте сначала, чтобы FB был создан, прежде чем вызывать функцию init.

Ответ 17

У меня была аналогичная проблема, и она оказалась Adblocker Pro. Обязательно проверьте, что это или другие блокирующие расширения отключены. Из-за этого я потерял около 1 часа 30 минут. Почувствуйте себя таким noob;)

Ответ 18

Установили ли свойство appId ваш текущий идентификатор приложения?

Ответ 19

Если вы используете JQuery, попробуйте поставить FB с вызовом Jquery

например.

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

который работал у меня