Что такое замена для FB.ensureInit () теперь?

Я загружаю FB API асинхронным способом:

Как я знаю, когда это инициализируется? Для чего замена FB.ensureInit() метод, который предотвратил бы выполнение включенный код до API, инициализируется?

8
задан sakibmoon 13 July 2013 в 07:44
поделиться

1 ответ

Когда вы загружаете скрипт Facebook, он выполняет window.fbAsyncInit, который уже есть в вашем скрипте. Если вы включаете вызов метода в качестве последней строки, внутри этого метода вы можете быть уверены, что FB был инициализирован.

Приведенный выше код становится

window.fbAsyncInit = function() {
  FB.init({appId: 'your app id', status: true, cookie: true,
           xfbml: true});
  afterInit();
};

Вы также можете определить свой собственный fbEnsureInit, который работает как раньше, и использовать семафор вместо вызова метода: (Первоначально из другого ответа.)

window.fbAsyncInit = function() {
  FB.init({appId: 'your app id', status: true, cookie: true,
           xfbml: true});
  fbApiInitialized = true;
};

function fbEnsureInit(callback) {
    if (!window.fbApiInitialized) {
        setTimeout(function() { fbEnsureInit(callback); }, 50);
    } else {
        if (callback) { callback(); }
    }
}

Еще один способ описан в вики Советы по производительности для Connect. Этот подход проверяет состояние скрипта и выполняет обратный вызов при загрузке скрипта.

Итак, в приведенном выше коде перед добавлением скрипта вставьте следующий код:

script.onload = script.onreadystatechange = function() {
  if ( !done && (!this.readyState || this.readyState == "loaded" ||
       this.readyState == "complete") ) {
    done = true;
    afterInit();
  }
};

Метод afterInit будет вызываться при загрузке скрипта.

8
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: