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

FB.init уже вызван

Я создаю приложение facebook iframe. Мое приложение загружается один раз (я получаю signed_request один раз), а затем я просматриваю страницы в iframe, используя внутренние ссылки домена. Я заметил, что вижу эти странные сообщения как в Chrome, так и в Firefox

FB.init has already been called - this could indicate a problem

Я уверен, что этот метод вызывается только один раз, и кажется, что Facebook хочет, чтобы я вызывал его один раз на загрузку приложения (не один раз на страницу).

window.fbAsyncInit = function() {
  FB.init({
    appId: param('facebook_app_id'),
    frictionlessRequests: true,
    oauth: true,
    channelUrl: site_url('/channel.html')
  })
}

Какую ошибку (если таковая имеется) я делаю здесь?

4b9b3361

Ответ 1

С момента передачи параметров в js.src, как #xfbml=1&appId=X, FB SDK автоматически инициализирует себя и, таким образом, FB.init будет пытаться повторно установить.. Поэтому в вашем коде вам не нужно удалять функцию FB.init, просто убедитесь, что вы не передаете параметры в коде, который асинхронно загружает JS SDK.

Замените это:

js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=X";

С помощью:

js.src = "//connect.facebook.net/en_US/sdk.js";

Надеюсь, что это поможет.

Ответ 2

Если вам действительно нужно вызвать init более одного раза, вы можете сделать это:

FB._initialized = false;
FB.init();

но для меня это не имеет смысла, у меня есть немного другая проблема, но она также связана с сообщением FB.init has already been called - this could indicate a problem.

У меня есть веб-сайт на основе AJAX, где после каждой загрузки страницы мне нужно отобразить XFBML из HTML, который я получаю из запроса AJAX (комментарии, такие как кнопка и другое):

 <div class="fb-comments" data-href="{REMOVED}" data-num-posts="5" data-width="760" colorscheme="dark"></div>

Для этого вы можете запустить это, когда вам нужно отобразить XFBML:

FB.XFBML.parse();

Ответ 3

У меня также была эта проблема. Я просто удалил часть FB.init({...}) и начал работать со следующим кодом:

window.fbAsyncInit = function () {
    FB.Event.subscribe('auth.logout', function () {
        // subscribe parts
    });

    // here is where fb.init() code was
};
(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/all.js#xfbml=1&appId=X";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

Я думаю, теперь он автоматически вводит код, поэтому нет необходимости делать это вручную. Теперь мой код работает снова. Надеюсь, это поможет.