Stary JS SDK miał funkcję o nazwie FB.ensureInit. Wydaje się, że nowy SDK nie ma takiej funkcji ... jak mogę się upewnić, że nie wykonuję wywołań interfejsu API, dopóki nie zostanie w pełni zainicjowany?
Umieszczam to na górze każdej strony:
<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
źródło
źródło
Odpowiedzi:
Aktualizacja z 4 stycznia 2012 r
Wygląda na to, że nie możesz po prostu wywoływać metod zależnych od FB (na przykład
FB.getAuthResponse()
) zaraz poFB.init()
jak poprzednio, ponieważ terazFB.init()
wydaje się być asynchroniczny. Pakowanie kodu wFB.getLoginStatus()
odpowiedź wydaje się wystarczać do wykrycia, kiedy API jest w pełni gotowe:lub jeśli korzystasz
fbEnsureInit()
z implementacji od dołu:Oryginalny post:
Jeśli chcesz po prostu uruchomić jakiś skrypt podczas inicjalizacji FB, możesz umieścić w nim funkcję wywołania zwrotnego
fbAsyncInit
:Jeśli chcesz dokładnego zastąpienia FB.ensureInit, musisz napisać coś samodzielnie, ponieważ nie ma oficjalnego zamiennika (duży błąd imo). Oto czego używam:
Stosowanie:
źródło
response
z powrotem zFB.getLoginStatus(function(response){}
? - zwróć uwagę na różnicę między „zaktualizowaną odpowiedzią” a „pierwotną odpowiedzią” powyżej.fbAsyncInit
, aby była wywoływana po załadowaniuwindow.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); };
W rzeczywistości Facebook już zapewnił mechanizm subskrybowania wydarzeń uwierzytelniania.
W twoim przypadku używasz " status: true ", co oznacza, że obiekt FB zażąda od Facebooka statusu logowania użytkownika.
Wywołując „FB.getLoginStatus ()” ponownie uruchamiasz to samo żądanie .
Zamiast tego możesz użyć FB.Event.subscribe, aby zasubskrybować zdarzenie auth.statusChange lub auth.authResponseChange PRZED wywołaniem FB.init
Najprawdopodobniej używając " status: false " możesz uruchomić dowolny kod zaraz po FB.init, ponieważ nie będzie wywołań asynchronicznych.
źródło
cookie
dotrue
w obiekcie startowych param.Oto rozwiązanie na wypadek, gdybyś używał jquery i Facebook asynchroniczne leniwe ładowanie:
źródło
version: 'v2.5'
init json innym mądrym to nie zadziała .. przynajmniej nie dla mnie. dzięki za pomocInnym sposobem sprawdzenia, czy FB został zainicjowany, jest użycie następującego kodu:
W związku z tym w zdarzeniu gotowym strony możesz sprawdzić ns.FBInitialized i odroczyć zdarzenie do późniejszej fazy za pomocą setTimeOut.
źródło
Chociaż niektóre z powyższych rozwiązań działają, pomyślałem, że opublikuję nasze ostateczne rozwiązanie - które definiuje „gotową” metodę, która zostanie uruchomiona, gdy tylko FB zostanie zainicjowany i gotowy do pracy. Ma tę przewagę nad innymi rozwiązaniami, że można bezpiecznie zadzwonić przed lub po przygotowaniu FB.
Można go używać w następujący sposób:
Oto plik źródłowy (zauważ, że jest zdefiniowany w przestrzeni nazw „f52.fb”).
źródło
Uniknąłem używania setTimeout, używając funkcji globalnej:
EDYTUJ UWAGA: Zaktualizowałem następujące skrypty pomocnicze i utworzyłem klasę, która jest łatwiejsza / prostsza w użyciu; sprawdź to tutaj ::: https://github.com/tjmehta/fbExec.js
fbEnsureInit wywoła swoje wywołanie zwrotne po FB.init
fbEnsureInitAndLoginStatus wywoła swoje wywołanie zwrotne po FB.init i po FB.getLoginStatus
Przykładowe użycie fbEnsureInit:
(FB.login należy uruchomić po zainicjowaniu FB)
Przykład zastosowania fbEnsureInitAndLogin:
(FB.api musi być uruchomiony po FB.init, a użytkownik FB musi być zalogowany.)
źródło
Zamiast używać dowolnego setTimeout lub setInterval, trzymałbym się obiektów odroczonych (implementacja przez jQuery tutaj ). Wciąż trudno jest rozwiązać kolejkę w odpowiednim momencie, ponieważ init nie ma callbacków, ale połączenie wyniku z subskrypcją zdarzenia (jak ktoś wcześniej wskazał), powinno załatwić sprawę i być wystarczająco blisko.
Pseudo-snippet wyglądałby następująco:
źródło
Oto prostsza metoda, która nie wymaga ani zdarzeń, ani limitów czasu. Wymaga jednak jQuery.
Użyj
jQuery.holdReady()
(dokumenty)Zatem natychmiast po skrypcie jQuery opóźnij zdarzenie ready.
Następnie, w funkcji inicjalizacji Facebooka, zwolnij ją:
Następnie możesz normalnie skorzystać z ready event:
źródło
Możesz zapisać się na wydarzenie:
to znaczy)
źródło
Małe, ale WAŻNE uwagi:
FB.getLoginStatus
musi zostać wywołane późniejFB.init
, w przeciwnym razie zdarzenie nie zostanie uruchomione.możesz użyć
FB.Event.subscribe('auth.statusChange', callback)
, ale nie uruchomi się, gdy użytkownik nie jest zalogowany na Facebooku.Oto działający przykład z obiema funkcjami
źródło
Interfejs API Facebooka wyszukuje FB._apiKey, więc możesz go obserwować przed wywołaniem własnej aplikacji API za pomocą czegoś takiego:
Nie jestem pewien, czy to robi różnicę, ale w moim przypadku - ponieważ chciałem mieć pewność, że interfejs użytkownika jest gotowy - zapakowałem inicjalizację z gotowym dokumentem jQuery (ostatni kawałek powyżej):
Zwróć też uwagę, że NIE używam async = true do ładowania pliku all.js Facebooka, co w moim przypadku wydaje się pomagać w bardziej niezawodnym logowaniu się do interfejsu użytkownika i sterowaniu funkcjami.
źródło
Czasami fbAsyncInit nie działa. Nie wiem dlaczego, więc używam tego obejścia:
źródło