В старом JS SDK была функция FB.ensureInit. Новый SDK, похоже, не имеет такой функции ... как я могу гарантировать, что я не буду делать вызовы api, пока он не будет полностью инициирован?
Я добавляю это вверху каждой страницы:
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $conf['fb']['appid']; ?>',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
FB.Canvas.setAutoResize();
};
(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>
javascript
facebook
Pablo
источник
источник
Ответы:
Обновление от 4 января 2012 г.
Похоже, вы не можете просто вызвать FB-зависимые методы (например
FB.getAuthResponse()
) сразу после того,FB.init()
как раньше, посколькуFB.init()
теперь это кажется асинхронным. Обертывание вашего кода вFB.getLoginStatus()
ответ, похоже, помогает определить, когда API полностью готов:или при использовании
fbEnsureInit()
реализации снизу:Исходное сообщение:
Если вы хотите просто запустить какой-то скрипт при инициализации FB, вы можете поместить внутрь некоторую функцию обратного вызова
fbAsyncInit
:Если вам нужна точная замена FB.ensureInit, вам придется написать что-то самостоятельно, поскольку официальной замены нет (большая ошибка, imo). Вот что я использую:
Использование:
источник
response
обратно отFB.getLoginStatus(function(response){}
? - обратите внимание на разницу между «обновленным ответом» и «исходным ответом» выше.fbAsyncInit
чтобы онаwindow.fbAsyncInit = function() { FB.init({ appId : '*************', channelUrl : 'http://www.mydomain.com', status : true, // check login status cookie : true, // enable cookies to allow the server to access the session oauth : true, // enable OAuth 2.0 xfbml : true // parse XFBML }); setTimeout(function() { myfunction(function (callback) {}, '', '', '' ); }, 1200); };
Фактически Facebook уже предоставил механизм для подписки на события аутентификации.
В вашем случае вы используете « status: true », что означает, что объект FB будет запрашивать у Facebook статус входа пользователя.
Вызывая «FB.getLoginStatus ()», вы снова выполняете тот же запрос .
Вместо того, чтобы вы могли использовать FB.Event.subscribe подписаться на auth.statusChange или auth.authResponseChange события ПЕРЕД вы звоните FB.init
Скорее всего, при использовании « status: false » вы можете запустить любой код сразу после FB.init, потому что асинхронных вызовов не будет.
источник
cookie
значениеtrue
в объекте init param.Вот решение, если вы используете JQuery и асинхронная отложенная загрузка Facebook:
источник
version: 'v2.5'
в init json, иначе это не сработает .. по крайней мере, не для меня. спасибо за помощьДругой способ проверить, инициализирован ли FB, - использовать следующий код:
Таким образом, в событии готовности страницы вы можете проверить ns.FBInitialized и отложить событие на более позднюю фазу с помощью setTimeOut.
источник
Хотя некоторые из вышеперечисленных решений работают, я решил опубликовать наше возможное решение, которое определяет «готовый» метод, который срабатывает, как только FB инициализируется и готов к работе. Его преимущество перед другими решениями в том, что его можно безопасно вызывать до или после того, как FB будет готов.
Его можно использовать так:
Вот исходный файл (обратите внимание, что он определен в пространстве имен f52.fb).
источник
Я избегал использования setTimeout, используя глобальную функцию:
ПРИМЕЧАНИЕ ИЗМЕНИТЬ: Я обновил следующие вспомогательные сценарии и создал класс, который проще / проще в использовании; проверьте здесь ::: https://github.com/tjmehta/fbExec.js
fbEnsureInit вызовет обратный вызов после FB.init
fbEnsureInitAndLoginStatus вызовет обратный вызов после FB.init и после FB.getLoginStatus
Пример использования fbEnsureInit:
(FB.login необходимо запустить после инициализации FB)
Пример использования fbEnsureInitAndLogin:
(FB.api необходимо запустить после того, как FB.init и пользователь FB должен войти в систему.)
источник
Вместо использования каких-либо setTimeout или setInterval я бы придерживался отложенных объектов (реализация jQuery здесь ). По-прежнему сложно разрешить очередь в нужный момент, потому что у init нет обратных вызовов, но объединение результата с подпиской на событие (как кто-то указал передо мной) должен сделать трюк и быть достаточно близким.
Псевдо-фрагмент будет выглядеть следующим образом:
источник
Вот более простой метод, который не требует ни событий, ни тайм-аутов. Однако для этого требуется jQuery.
использование
jQuery.holdReady()
(документы)Итак, сразу после вашего сценария jQuery отложите событие готовности.
Затем в своей функции инициализации Facebook отпустите ее:
Затем вы можете использовать готовое событие как обычно:
источник
Вы можете подписаться на событие:
то есть)
источник
Небольшие, но ВАЖНЫЕ примечания:
FB.getLoginStatus
должен быть вызван послеFB.init
, иначе он не вызовет событие.вы можете использовать
FB.Event.subscribe('auth.statusChange', callback)
, но он не сработает, если пользователь не вошел в facebook.Вот рабочий пример с обеими функциями
источник
API Facebook следит за FB._apiKey, поэтому вы можете следить за этим, прежде чем вызывать собственное приложение API с чем-то вроде:
Не уверен, что это имеет значение, но в моем случае - поскольку я хотел убедиться, что пользовательский интерфейс готов - я завернул инициализацию с готовым документом jQuery (последний бит выше):
Также обратите внимание, что я НЕ использую async = true для загрузки Facebook all.js, что в моем случае, похоже, помогает более надежно войти в пользовательский интерфейс и управлять функциями.
источник
Иногда fbAsyncInit не работает. Я не знаю, почему, и тогда использую этот обходной путь:
источник