it-swarm.com.ru

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.

39
Alex Miller

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

51
pbz

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

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
}
49
Matty

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

23
Todd Kamin

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

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

Я изменил это на

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

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

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

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

5
Woppi

У меня был очень грязный код, который загружал 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

4
Nick Lim

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

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

3
eggie5

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

2
Hosh Sadiq

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

Чтобы проверить предложения Мэттиса о том, что 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);
    });
1
Scott Savage

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

1
Juan

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

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

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

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

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

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

1
Diego Malone

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

1
Stoic

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

0
rupert_b

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

0
Mangirdas

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

0
Trevino Jarrett