Как обойти «FB не определен»? - PullRequest
32 голосов
/ 16 марта 2011

Иногда при загрузке http://connect.facebook.net/en_US/all.js

возникает проблема «FB не определен». Я понял, что проблема в том, что иногда мой сайт просто не загружает этот файл,Таким образом, он ничего не получает, и объект FB буквально не существует.

Мое решение состоит в том, чтобы предотвратить моих пользователей, когда это происходит, поэтому я пробовал следующие коды в JavaScript, но ни один из них не работает:*

if (FB) {/*run the app*/} else {/*alert the user*/}
if (FB!==false) {/*run the app*/} else {/*alert the user*/}
if (FB!='undefined') {/*run the app*/} else {/*alert the user*/}

спасибо за ответ!

Ответы [ 12 ]

77 голосов
/ 17 марта 2011

Я думаю, вам следует решить основную проблему, решение которой предоставлено Facebook ( Асинхронная загрузка SDK ):

Вы должны вставить его сразу после открывающего тега на каждой странице, которую хотите загрузить:

<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId      : 'your-app-id',
      xfbml      : true,
      version    : 'v2.1'
    });
  };

  (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>

Из документации :

В Facebook SDK для JavaScript нет автономных файлов, которые нужно скачать или установить, вместо этого вам просто нужно включить короткий кусочек обычного JavaScript в вашем HTML, который будет асинхронно загружать SDK на ваши страницы. означает асинхронную нагрузку что он не блокирует загрузку других элементов вашей страницы.

ОБНОВЛЕНИЕ: с использованием последнего кода из документации.

16 голосов
/ 16 марта 2011

Предполагая, что FB - это переменная, содержащая объект Facebook, я бы попробовал что-то вроде этого:

if (typeof(FB) != 'undefined'
     && FB != null ) {
    // run the app
} else {
    // alert the user
}

Чтобы проверить, что что-то не определено в простом старом JavaScript, вы должны использовать "typeof"оператор.Пример, который вы показываете, где вы просто сравниваете его со строкой «undefined», оценивается как false, если ваш объект FB действительно не содержит строку «undefined»!

В качестве отступления, вы можете использовать различные инструменты, такие какFirebug (в Firefox), чтобы узнать, можете ли вы понять, почему файл Facebook не загружается.

11 голосов
/ 27 апреля 2012

Полагаю, вы пропустили точку с запятой ; в закрывающей фигурной скобке } из window.fbAsyncInit = function() { ... };

9 голосов
/ 11 мая 2012

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

Вместо http://connect.facebook.net/en_US/all.js, я использовал HTTPS и изменил его на https://connect.facebook.net/en_US/all.js и это исправило мою проблему.

4 голосов
/ 25 июня 2016

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

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

если вы используете 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>
2 голосов
/ 16 марта 2011

Вы были очень близки с вашим оригинальным примером.Вы можете использовать предложение @ jAndy или:

if (typeof FB != 'undefined')
1 голос
/ 15 апреля 2014

FB рекомендует добавлять async all.js include сразу после тела, чтобы подготовить объект FB при использовании его на странице.

Вы также можете использовать искусственную задержку, используя setTimeout, чтобы убедиться, что объект FBзагружен.например,

<script>setTimeout(function(){
FB.Event.subscribe('edge.create',
function (response) {
    alert('msg via fb');
});},2000);
</script>
1 голос
/ 26 февраля 2014

ФБ никогда не определялся. Оказалось, что я прототипировал функции в классе Object с именем «merge», а другой - с именем «toArray». Оба они испортили Facebook, сообщений об ошибках нет, но он не загружается.

Я изменил имена своих прототипов, теперь это работает. Эй, если Facebook собирается создать прототип Object, разве мне не позволено его прототипировать?

1 голос
/ 16 марта 2011

Довольно странно, что FB не загружается в ваш javascript, если у вас там правильно есть скрипт-тег. Убедитесь, что в вашем браузере не установлены блокировщики JavaScript, блокировщики рекламы, блокировщики отслеживания и т. Д., Которые нейтрализуют код FB Connect.

0 голосов
/ 10 августа 2017
...
</head>
<body>
    <!-- Load Facebook SDK for JavaScript -->
    <div id="fb-root"></div>
<script type="text/javascript">
...

Проверьте div id = "fb-root" / div "!!! Очень важно запустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...