FB est indéfini même si je l'ai juste utilisé
Je suis en train d'ajouter un Facebook Comme le bouton de widget que je suis en train de créer. Le code que j'utilise pour ajouter le Facebook comme le bouton de ma page est la suivante:
widget.html
<body>
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '263071593731910',
status : false, //check login status
cookie : true, //enable cookies to allow the server to access the session
xfbml : true //parse XFBML
});
};
(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>
<div id="fb-button"></div>
<script type="text/javascript" src="widget.js"></script>
widget.js
$(function(){
var fb = $(document.createElement("fb:like"));
fb.attr({
href: data.facebook,
send: false,
layout: 'button_count',
width: 70,
'show_faces': false
});
$("#fb-button").empty().append(fb);
FB.XFBML.parse($("#fb-button").get(0));
FB.Event.subscribe('edge.create',changeView);
});
*La changeView fonction existe aussi bien dans le JavaScript.
Lorsque j'exécute le code, j'obtiens une erreur: Uncaught ReferenceError: FB is not defined
même si le bouton est créé. L'erreur est pointant vers la ligne contenant FB.XFBML.analyser le code. Est-il quelque chose que je dois faire différemment dans mon JavaScript?
source d'informationauteur Dave Long
Vous devez vous connecter pour publier un commentaire.
Le point de l'ensemble de ce gros bloc de script de départ avec
window.fbAsyncInit
est que le Facebook SDK est chargé de manière asynchrone.Même si vous avez vos appels contre
FB
à l'intérieur d'un jQuery document prêt de rappel, ce n'est pas suffisant pour assurer le kit de développement est chargé lorsque ce code est exécuté.Heureusement,
window.fbAsyncInit
existe pour exactement cette fin: il ne sera pas courir jusqu'à ce que le kit de développement a chargé.De Facebook de docs:
J'ai eu ce problème et résolu de la même manière à la solution qui Amry fourni donc je poste ici au cas où quelqu'un d'autre a besoin de l'utiliser.
J'ai fait l'hypothèse de départ que le FB d'initialisation de l'appel lancé dans la fbAsyncInit méthode initialize immédiatement, donc j'ai aussi codé mon utilisation de FB objet dans un
$(document).ready()
méthode. Ce n'est pas le cas. fbAsyncInit prend assez peu de temps après le chargement de la page pour terminer l'initialisation. Voici ma solution, lors de l'utilisation de jQuery sur mon site:La dernière tâche est de passer simplement votre
$(document).ready()
code pour un bind pour votre événement. Cela va à l'endroit où vous vous trouvez à l'aide de la FB objet.Une chose que je dois également mentionner: Firefox est beaucoup plus tolérantes à ce que les navigateurs Webkit, comme le Chrome. Je ne pouvais pas comprendre pourquoi AUCUN de mes jQuery a été correctement son travail dans Chrome... eh bien, c'est pourquoi.
J'espère que cela aide quelqu'un.
FB n'était pas encore défini à ce point de temps. Vous n'avez pas encore utilisé, vous aviez tout simplement tapé plus tôt. Le
FB.XFMBL.parse
ligne s'exécute lorsque le document est prêt. En va de même pour la//connect.facebook.net/en_US/all.js
ligne. Il n'est donc pas vraiment fiable le code qui sera exécuté en premier, si elle est exécutée à partir d'un même événement.Ce que vous pouvez faire est en quelque sorte le code que vous voulez exécuter à partir d'
window.fbAsyncInit
. À partir de ce point, vous pouvez être sûr queFB
est prêt à être utilisé.Une façon que vous pouvez faire si vous ne voulez pas mélanger le code que vous avez dans widget.js est par l'utilisation de jQuery événement personnalisé. Alors au lieu d'avoir
$(function() { ... });
vous aurez quelque chose le long de cette ligne:Alors vous aurez
window.fbAsyncInit
appel$(window).triggerHandler('fbAsyncInit')
juste après laFB.init()
ligne.