Das alte JS SDK hatte eine Funktion namens FB.ensureInit. Das neue SDK scheint keine solche Funktion zu haben ... Wie kann ich sicherstellen, dass ich keine API-Aufrufe tätige, bis es vollständig initiiert ist?
Ich füge dies oben auf jeder Seite ein:
<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
quelle
quelle
Antworten:
Update am 04. Januar 2012
Es scheint, dass Sie nicht einfach FB-abhängige Methoden (zum Beispiel
FB.getAuthResponse()
) direkt nachFB.init()
wie zuvor aufrufen können , daFB.init()
dies jetzt asynchron zu sein scheint. Das Einschließen Ihres Codes in eineFB.getLoginStatus()
Antwort scheint den Trick zu tun, zu erkennen, wann die API vollständig bereit ist:oder wenn Sie die
fbEnsureInit()
Implementierung von unten verwenden:Ursprünglicher Beitrag:
Wenn Sie bei der Initialisierung des FB nur ein Skript ausführen möchten, können Sie eine Rückruffunktion einfügen
fbAsyncInit
:Wenn Sie FB.ensureInit exakt ersetzen möchten, müssen Sie selbst etwas schreiben, da es keinen offiziellen Ersatz gibt (großer Fehler imo). Folgendes benutze ich:
Verwendung:
quelle
response
wieder ausFB.getLoginStatus(function(response){}
? - Beachten Sie den Unterschied zwischen der "aktualisierten Antwort" und der "ursprünglichen Antwort" oben.fbAsyncInit
, damit sie nach dem Laden aufgerufen werden konntewindow.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); };
Tatsächlich hat Facebook bereits einen Mechanismus zum Abonnieren von Authentifizierungsereignissen bereitgestellt.
In Ihrem Fall verwenden Sie " status: true ", was bedeutet, dass das FB-Objekt Facebook nach dem Anmeldestatus des Benutzers anfordert.
Durch Aufrufen von "FB.getLoginStatus ()" führen Sie dieselbe Anforderung erneut aus .
Stattdessen könnten Sie FB.Event.subscribe abonnieren auth.statusChange oder auth.authResponseChange Ereignis bevor Sie FB.init rufen
Wenn Sie " status: false " verwenden, können Sie höchstwahrscheinlich jeden Code direkt nach FB.init ausführen, da keine asynchronen Aufrufe stattfinden.
quelle
cookie
, wird diestrue
im init param-Objekt festgelegt.Hier ist eine Lösung für den Fall, dass Sie verwenden jquery und Facebook Asynchronous Lazy Loading:
quelle
version: 'v2.5'
im init json hinzu, sonst würde es nicht funktionieren .. zumindest nicht für mich. Danke für die HilfeEine andere Möglichkeit, um zu überprüfen, ob der FB initialisiert wurde, ist die Verwendung des folgenden Codes:
Auf diese Weise können Sie in Ihrem seitenbereiten Ereignis ns.FBInitialized überprüfen und das Ereignis mithilfe von setTimeOut auf eine spätere Phase verschieben.
quelle
Während einige der oben genannten Lösungen funktionieren, dachte ich, ich würde unsere endgültige Lösung veröffentlichen - die eine "Bereit" -Methode definiert, die ausgelöst wird, sobald FB initialisiert und einsatzbereit ist. Es hat gegenüber anderen Lösungen den Vorteil, dass Sie sicher anrufen können, bevor oder nachdem FB bereit ist.
Es kann wie folgt verwendet werden:
Hier ist die Quelldatei (beachten Sie, dass sie in einem 'f52.fb'-Namespace definiert ist).
quelle
Ich habe die Verwendung von setTimeout durch die Verwendung einer globalen Funktion vermieden:
BEARBEITEN HINWEIS: Ich habe die folgenden Hilfsskripte aktualisiert und eine Klasse erstellt, die einfacher / benutzerfreundlicher ist. Überprüfen Sie es hier ::: https://github.com/tjmehta/fbExec.js
fbEnsureInit ruft seinen Rückruf nach FB.init auf
fbEnsureInitAndLoginStatus ruft seinen Rückruf nach FB.init und nach FB.getLoginStatus auf
Beispiel für die Verwendung von fbEnsureInit:
(FB.login muss ausgeführt werden, nachdem FB initialisiert wurde)
Beispiel für die Verwendung von fbEnsureInitAndLogin:
(FB.api muss ausgeführt werden, nachdem FB.init und der FB-Benutzer angemeldet sind.)
quelle
Anstatt setTimeout oder setInterval zu verwenden, würde ich mich an verzögerte Objekte halten (Implementierung durch jQuery hier ). Es ist immer noch schwierig, die Warteschlange im richtigen Moment aufzulösen, da init keine Rückrufe hat, aber das Kombinieren des Ergebnisses mit dem Ereignisabonnement (wie jemand vor mir gezeigt hat) den Trick machen und nah genug sein sollte.
Pseudo-Snippet würde wie folgt aussehen:
quelle
Hier ist eine einfachere Methode, die weder Ereignisse noch Zeitüberschreitungen erfordert. Es erfordert jedoch jQuery.
Verwenden Sie
jQuery.holdReady()
(docs)Verzögern Sie also sofort nach Ihrem jQuery-Skript das Ready-Ereignis.
Lassen Sie es dann in Ihrer Facebook-Init-Funktion los:
Dann können Sie das Ereignis ready wie gewohnt verwenden:
quelle
Sie können die Veranstaltung abonnieren:
dh)
quelle
Kleine aber wichtige Hinweise:
FB.getLoginStatus
muss nach aufgerufen werdenFB.init
, sonst wird das Ereignis nicht ausgelöst.Sie können verwenden
FB.Event.subscribe('auth.statusChange', callback)
, aber es wird nicht ausgelöst, wenn der Benutzer nicht bei Facebook angemeldet ist.Hier ist das Arbeitsbeispiel mit beiden Funktionen
quelle
Die Facebook-API sucht nach dem FB._apiKey, sodass Sie darauf achten können, bevor Sie Ihre eigene Anwendung der API mit folgenden Elementen aufrufen:
Ich bin mir nicht sicher, ob dies einen Unterschied macht, aber in meinem Fall - weil ich sichergehen wollte, dass die Benutzeroberfläche bereit ist - habe ich die Initialisierung mit dem bereitstehenden Dokument von jQuery abgeschlossen (letztes Bit oben):
Beachten Sie auch, dass ich NICHT async = true verwende, um all.js von Facebook zu laden. In meinem Fall scheint dies dabei zu helfen, sich zuverlässiger bei der Benutzeroberfläche anzumelden und Funktionen zu steuern.
quelle
Manchmal funktioniert fbAsyncInit nicht. Ich weiß nicht warum und verwende diese Problemumgehung dann:
quelle