Я загружаю FB API асинхронным способом:
Как я знаю, когда это инициализируется? Для чего замена FB.ensureInit()
метод, который предотвратил бы выполнение включенный код до API, инициализируется?
1° Когда вы загружаете скрипт Facebook, он выполняет window.fbAsyncInit
, который уже есть в вашем скрипте. Если вы включаете вызов метода в качестве последней строки, внутри этого метода вы можете быть уверены, что FB был инициализирован.
Приведенный выше код становится
window.fbAsyncInit = function() {
FB.init({appId: 'your app id', status: true, cookie: true,
xfbml: true});
afterInit();
};
2° Вы также можете определить свой собственный 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(); }
}
}
3° Еще один способ описан в вики Советы по производительности для Connect. Этот подход проверяет состояние скрипта и выполняет обратный вызов при загрузке скрипта.
Итак, в приведенном выше коде перед добавлением скрипта вставьте следующий код:
script.onload = script.onreadystatechange = function() {
if ( !done && (!this.readyState || this.readyState == "loaded" ||
this.readyState == "complete") ) {
done = true;
afterInit();
}
};
Метод afterInit
будет вызываться при загрузке скрипта.