web-dev-qa-db-fra.com

Comment contourner 'FB n'est pas défini'?

Parfois, je reçois le problème "FB n'est pas défini" lors du chargement de http://connect.facebook.net/en_US/all.js

J'ai réalisé que le problème est dû au fait que parfois mon site Web ne charge tout simplement pas ce fichier. Donc, il n'obtient rien, et l'objet FB n'existe littéralement pas.

Ma solution est d'empêcher mes utilisateurs lorsque cela se produit, j'ai donc essayé les codes suivants en JavaScript mais aucun ne semble fonctionner:

if (FB) {/*run the app*/} else {/*alert the user*/}
if (FB!==false) {/*run the app*/} else {/*alert the user*/}
if (FB!='undefined') {/*run the app*/} else {/*alert the user*/}

merci d'avoir répondu!

32

En supposant que FB est une variable contenant l'objet Facebook, j'essaierais quelque chose comme ceci:

if (typeof(FB) != 'undefined'
     && FB != null ) {
    // run the app
} else {
    // alert the user
}

Afin de tester que quelque chose n'est pas défini dans du JavaScript ancien, vous devez utiliser l'opérateur "typeof". L'exemple que vous montrez où vous le comparez à la chaîne "non défini" sera évalué à faux, à moins que votre objet FB ne contienne vraiment la chaîne "non définie"!

En passant, vous souhaiterez peut-être utiliser divers outils comme Firebug (dans Firefox) pour voir si vous pouvez comprendre pourquoi le fichier Facebook ne se charge pas.

16
Rob Levine

Je pense que vous devriez plutôt résoudre le problème principal, quelle solution est fournie par Facebook ( Chargement du SDK de manière asynchrone):

Vous devez l'insérer directement après la balise d'ouverture sur chaque page que vous souhaitez charger:

<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId      : 'your-app-id',
      xfbml      : true,
      version    : 'v2.1'
    });
  };

  (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/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>

De la documentation :

Le SDK Facebook pour JavaScript n'a pas de fichiers autonomes qui doivent être téléchargés ou installés, à la place, vous devez simplement inclure un court morceau de JavaScript standard dans votre code HTML qui chargera le SDK de manière asynchrone dans vos pages. Le chargement asynchrone signifie qu'il ne bloque pas le chargement d'autres éléments de votre page.

MISE À JOUR: en utilisant le dernier code de la documentation.

77
ifaour

Je suppose que vous avez manqué de mettre le point-virgule ; À l'accolade de fermeture } De window.fbAsyncInit = function() { ... };

11
egenita

Pour les personnes qui ont toujours ce bug FB, j'utilise ce correctif effronté pour résoudre ce problème.

Au lieu de http://connect.facebook.net/en_US/all.js , j'ai utilisé [~ # ~] https [~ # ~] et l'a changé en https://connect.facebook.net/en_US/all.js et il a résolu mon problème.

9
Naseem Sarwar

Il y a une solution pour vous :)

Vous devez exécuter votre script après le chargement de la fenêtre

si vous utilisez jQuery, vous pouvez utiliser de manière simple:

<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function() {
        FB.init({
            appId      : 'your-app-id',
            xfbml      : true,
            status     : true,
            version    : 'v2.5'
        });
    };

    (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/sdk.js";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
</script>

<script>
$(window).load(function() {
    var comment_callback = function(response) {
        console.log("comment_callback");
        console.log(response);
    }
    FB.Event.subscribe('comment.create', comment_callback);
    FB.Event.subscribe('comment.remove', comment_callback);
});
</script>
4
manhhaiphp

Vous étiez très proche de votre exemple original. Vous pouvez utiliser la suggestion de @ jAndy ou:

if (typeof FB != 'undefined')
2
kim3er

Il est assez étrange que FB ne soit pas chargé dans votre javascript si vous y avez correctement la balise de script. Vérifiez que vous n'avez pas de bloqueurs javascript, de bloqueurs de publicités, de bloqueurs de suivi, etc. installés dans votre navigateur qui neutralisent votre code FB Connect.

1
B_.

Je n'avais jamais défini FB. Il s'est avéré que je prototypais des fonctions dans la classe Object appelée "fusion" et une autre appelée "toArray". Les deux ont foiré Facebook, aucun message d'erreur mais il ne se chargeait pas.

J'ai changé les noms de mes prototypes, ça marche maintenant. Hé, si Facebook va prototyper Object, ne devrais-je pas être autorisé à le prototyper?

1
zstew

FB recommande d'ajouter l'async all.js include juste après le corps, afin que l'objet FB soit préparé lorsque vous l'utilisez dans la page.

Vous pouvez également avoir un retard artificiel en utilisant setTimeout pour vous assurer que l'objet FB est chargé. par exemple.

<script>setTimeout(function(){
FB.Event.subscribe('Edge.create',
function (response) {
    alert('msg via fb');
});},2000);
</script>
1
Azghanvi
...
</head>
<body>
    <!-- Load Facebook SDK for JavaScript -->
    <div id="fb-root"></div>
<script type="text/javascript">
...

Vérifiez div id = "fb-root"/div "!!! Il est très important d'exécuter.

0
<script>  
    window.fbAsyncInit = function() {    
        FB.init({      
            appId      :'your-app-id',      
            xfbml      :true,      
            version    :'v2.1'
        });
    };
    (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 /sdk.js";     
        fjs.parentNode.insertBefore(js, fjs);
    }
    (document,'script','facebook-jssdk'));
</script> 

De la documentation: Le SDK Facebook pour JavaScript n'a pas de fichiers autonomes qui doivent être téléchargés ou installés, au lieu de cela, vous devez simplement inclure un court morceau de JavaScript standard dans votre HTML

0
Sachethe singh

J'ai eu un problème similaire et il s'est avéré être Adblocker Pro. Assurez-vous de vérifier que cette extension ou d'autres extensions de blocage ont été désactivées. J'ai perdu environ 1h30 à cause de cela. Sentez-vous comme un tel noob;)

0
rupi