L'ancien SDK JS avait une fonction appelée FB.ensureInit. Le nouveau SDK ne semble pas avoir une telle fonction ... comment puis-je m'assurer que je ne passe pas d'appels API tant qu'il n'est pas complètement lancé?
J'inclus ceci en haut de chaque page:
<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
la source
la source
Réponses:
Mise à jour le 04 janvier 2012
Il semble que vous ne pouvez pas simplement appeler des méthodes dépendantes de FB (par exemple
FB.getAuthResponse()
) juste aprèsFB.init()
comme avant, comme celaFB.init()
semble être asynchrone maintenant. Envelopper votre code enFB.getLoginStatus()
réponse semble faire le tour de détecter quand l'API est complètement prête:ou si vous utilisez l'
fbEnsureInit()
implémentation ci-dessous:Message original:
Si vous voulez simplement exécuter un script lorsque FB est initialisé, vous pouvez mettre une fonction de rappel à l'intérieur
fbAsyncInit
:Si vous voulez un remplacement exact de FB.ensureInit, vous devrez écrire quelque chose par vous-même car il n'y a pas de remplacement officiel (grosse erreur imo). Voici ce que j'utilise:
Usage:
la source
response
retourFB.getLoginStatus(function(response){}
? - notez la différence entre la "réponse mise à jour" et la "réponse originale" ci-dessus.fbAsyncInit
pour qu'elle soit appelée après le chargementwindow.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); };
En fait, Facebook a déjà fourni un mécanisme pour s'abonner aux événements d'authentification.
Dans votre cas, vous utilisez " status: true ", ce qui signifie que l'objet FB demandera à Facebook le statut de connexion de l'utilisateur.
En appelant « FB.getLoginStatus () » vous exécutez la même demande à nouveau .
Vous pourriez plutôt utiliser FB.Event.subscribe pour vous abonner à auth.statusChange ou auth.authResponseChange événement AVANT que vous appelez FB.init
Très probablement, lorsque vous utilisez " status: false ", vous pouvez exécuter n'importe quel code juste après FB.init, car il n'y aura pas d'appels asynchrones.
la source
cookie
surtrue
dans l'objet init param.Voici une solution au cas où vous utiliseriez jquery et chargement paresseux asynchrone Facebook:
la source
version: 'v2.5'
dans le json init autrement il ne fonctionnera pas .. au moins n'a pas pour moi. merci pour l'aideUne autre façon de vérifier si FB s'est initialisé consiste à utiliser le code suivant:
Ainsi, dans votre événement de page prête, vous pouvez vérifier ns.FBInitialized et reporter l'événement à une phase ultérieure en utilisant setTimeOut.
la source
Bien que certaines des solutions ci-dessus fonctionnent, j'ai pensé publier notre solution éventuelle - qui définit une méthode `` prête '' qui se déclenchera dès que FB est initialisé et prêt à fonctionner. Il présente l'avantage par rapport aux autres solutions d'appeler en toute sécurité avant ou après que FB soit prêt.
Il peut être utilisé comme ceci:
Voici le fichier source (notez qu'il est défini dans un espace de noms 'f52.fb').
la source
J'ai évité d'utiliser setTimeout en utilisant une fonction globale:
NOTE DE MODIFICATION: J'ai mis à jour les scripts d'assistance suivants et créé une classe plus facile / plus simple à utiliser; vérifiez-le ici ::: https://github.com/tjmehta/fbExec.js
fbEnsureInit appellera son rappel après FB.init
fbEnsureInitAndLoginStatus appellera son rappel après FB.init et après FB.getLoginStatus
Exemple d'utilisation de fbEnsureInit:
(FB.login doit être exécuté après l'initialisation du FB)
Exemple d'utilisation de fbEnsureInitAndLogin:
(FB.api doit être exécuté après FB.init et l'utilisateur FB doit être connecté.)
la source
Au lieu d'utiliser n'importe quel setTimeout ou setInterval, je m'en tiendrais aux objets différés (implémentation par jQuery ici ). Il est toujours difficile de résoudre la file d'attente au bon moment, car init n'a pas de rappel, mais en combinant le résultat avec l'abonnement aux événements (comme quelqu'un l'a indiqué avant moi), cela devrait faire l'affaire et être suffisamment proche.
Le pseudo-extrait ressemblerait à ceci:
la source
Voici une méthode plus simple, qui ne nécessite ni événements ni délais. Cependant, il nécessite jQuery.
Utiliser
jQuery.holdReady()
(docs)Donc, immédiatement après votre script jQuery, retardez l'événement ready.
Ensuite, dans votre fonction d'initialisation Facebook, relâchez-le:
Ensuite, vous pouvez utiliser l'événement ready comme d'habitude:
la source
Vous pouvez vous abonner à l'événement:
c'est à dire)
la source
Avis petits mais IMPORTANTS:
FB.getLoginStatus
doit être appelé aprèsFB.init
, sinon il ne déclenchera pas l'événement.vous pouvez utiliser
FB.Event.subscribe('auth.statusChange', callback)
, mais il ne se déclenchera pas lorsque l'utilisateur n'est pas connecté à Facebook.Voici l'exemple de travail avec les deux fonctions
la source
L'API Facebook surveille la FB._apiKey afin que vous puissiez surveiller cela avant d'appeler votre propre application de l'API avec quelque chose comme:
Je ne suis pas sûr que cela fasse une différence mais dans mon cas - parce que je voulais être sûr que l'interface utilisateur était prête - j'ai encapsulé l'initialisation avec le document de jQuery prêt (dernier bit ci-dessus):
Notez également que je n'utilise PAS async = true pour charger all.js de Facebook, ce qui, dans mon cas, semble aider à me connecter à l'interface utilisateur et à gérer les fonctionnalités de manière plus fiable.
la source
Parfois, fbAsyncInit ne fonctionne pas. Je ne sais pas pourquoi et utiliser cette solution de contournement alors:
la source