web-dev-qa-db-fra.com

FB.init a déjà été appelé

Je construis l'application facebook iframe. Mon application est chargée une fois (je reçois une fois signé_request), puis je navigue dans les pages de l'iframe à l'aide de liens de domaine internes. J'ai remarqué que je vois ces messages étranges à la fois dans Chrome et Firefox

FB.init has already been called - this could indicate a problem

Je suis à peu près sûr que cette méthode n'est appelée qu'une seule fois et il semble que Facebook veuille que je l'appelle une fois par chargement d'application (pas une fois par page).

window.fbAsyncInit = function() {
  FB.init({
    appId: param('facebook_app_id'),
    frictionlessRequests: true,
    oauth: true,
    channelUrl: site_url('/channel.html')
  })
}

Quelle erreur (le cas échéant) est-ce que je fais ici?

53
potomok

À partir du moment où vous transmettez des paramètres au js.src comme #xfbml=1&appId=X, FB SDK se lancera automatiquement et donc FB.init tentera de réinitialiser .. Ainsi, dans votre code, vous n'avez pas à supprimer la fonction FB.init, assurez-vous simplement ne transmettez pas de paramètres dans le code qui charge de manière asynchrone le SDK JS.

Remplacez ceci:

js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=X";

Avec :

js.src = "//connect.facebook.net/en_US/sdk.js";

J'espère que cela t'aides.

157
Tinou

Si vous avez vraiment besoin d'appeler init plus d'une fois, vous pouvez le faire:

FB._initialized = false;
FB.init();

mais cela n'a aucun sens pour moi, j'ai un problème un peu différent, mais il est également lié au message FB.init has already been called - this could indicate a problem.

J'ai un site Web basé sur AJAX où, après chaque chargement de page, je dois restituer XFBML à partir du code HTML que je reçois de la demande AJAX (commentaires, comme button et autre):

 <div class="fb-comments" data-href="{REMOVED}" data-num-posts="5" data-width="760" colorscheme="dark"></div>

Pour ce faire, vous pouvez l'exécuter lorsque vous devez rendre XFBML: 

FB.XFBML.parse();
10

J'ai aussi eu ce problème. J'ai simplement supprimé la partie FB.init({...}) et elle a commencé à fonctionner avec le code suivant:

window.fbAsyncInit = function () {
    FB.Event.subscribe('auth.logout', function () {
        // subscribe parts
    });

    // here is where fb.init() code was
};
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=X";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

Je suppose que cela entre maintenant automatiquement dans le code, il n’est donc pas nécessaire de le faire manuellement. Maintenant, mon code fonctionne à nouveau. J'espère que ça aide.

0
pwkc