wake-up-neo.com

Facebook Javascript SDK Problem: "FB ist nicht definiert"

Der folgende Code, der aus der Facebook-Dokumentation hier kopiert wurde, funktioniert in Chrome nicht für mich.

<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
  FB.init({
  appId  : 'YOUR APP ID',
  status : true, // check login status
  cookie : true, // enable cookies to allow the server to access the session
  xfbml  : true  // parse XFBML
});
</script>

In der Javascript-Konsole bekomme ich:

Uncaught ReferenceError: FB is not defined

Ich habe keine Probleme mit dem SDK in Firefox oder Safari, nur Chrome.

39
Alex Miller

Ich habe einen Fall gesehen, in dem Chrome WidgetBlock installiert hatte, wodurch das Facebook-Skript blockiert wurde. Das Ergebnis war genau diese Fehlermeldung. Stellen Sie sicher, dass Sie Erweiterungen deaktivieren, die möglicherweise stören.

51
pbz

Das Problem ist also, dass Sie nicht darauf warten, dass die Init abgeschlossen ist. Dies führt zu zufälligen Ergebnissen. Hier ist was ich benutze.

window.fbAsyncInit = function () {
    FB.init({ appId: 'your-app-id', cookie: true, xfbml: true, oauth: true });

    // *** here is my code ***
    if (typeof facebookInit == 'function') {
        facebookInit();
    }
};

(function(d){
    var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    d.getElementsByTagName('head')[0].appendChild(js);
}(document));

Dadurch wird sichergestellt, dass die Funktion facebookInit verfügbar ist und ausgeführt wird, sobald alles geladen ist. Auf diese Weise müssen Sie den Init-Code nicht jedes Mal duplizieren, wenn Sie ihn verwenden möchten.

function facebookInit() {
   // do what you would like here
}
49
Matty

Dieser Fehler wird auch angezeigt, wenn Sie das Semikolon nach der Definition von fbAsyncInit nicht angeben.

window.fbAsyncInit = function() {
    FB.init({
        appId: 'YOUR APP ID',
        status: true,
        cookie: true,
        xfbml: true
    });
    //do stuff
}; //<-- semicolon required!

Ohne das Semikolon ist die Situation dieselbe wie in diesem kürzeren Beispiel:

var x = function () {
    console.log('This is never called. Or is it?');
}

('bar');

Die Funktion wird aufgerufen, denn ohne das Semikolon wird der ('bar'-) Teil als Aufruf der soeben definierten Funktion gesehen.

23
Todd Kamin

Ich bin auch auf dieses Problem gestoßen, und was es gelöst hat, hat nichts mit Facebook zu tun, aber das vorherige Skript, das ich hinzugefügt hatte, war in schlechtem Zustand

<script type="text/javascript" src="js/my_script.js" />

Ich habe es geändert

<script type="text/javascript" src="js/my_script.js"></script>

Und es funktioniert...

Weew ... hoffentlich kann meine Erfahrung anderen dabei helfen, die fast alles getan haben, aber immer noch nicht funktionieren ... 

Oh Junge ... ^^

5
Woppi

Ich hatte einen sehr chaotischen Cody, der das Javascript von Facebook über AJAX geladen hat, und ich musste sicherstellen, dass die js-Datei vollständig geladen wurde, bevor ich FB.init .__ anrufe

    $jQuery.load( document.location.protocol + '//connect.facebook.net/en_US/all.js',
      function (obj) {
        FB.init({
           appId  : 'YOUR APP ID',
           status : true, // check login status
           cookie : true, // enable cookies to allow the server to access the session
           xfbml  : true  // parse XFBML
        });
        //ANy other FB.related javascript here
      });

Dieser Code verwendet jquery, um das Javascript zu laden und die Funktion callback onLoad des Javascript auszuführen. Es ist viel unordentlicher als das Erstellen eines onLoad-Ereignislisteners für den Block, der am Ende bei IE6, 7 und 8 nicht sehr gut funktionierte

4
Nick Lim

Versuchen Sie asynchrones Laden: http://developers.facebook.com/docs/reference/javascript/fb.init/

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId  : 'YOUR APP ID',
      status : true, // 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>
4
beshkenadze

AdBlock blockiert die Facebook-JS-API-Skripte, da es mit Facebook Connect zusammenhängt, was oft ärgerlich ist. 

3
eggie5

Nicht sicher, ob Sie dieses Problem immer noch haben, aber ich hatte nur das gleiche Problem. Es stellte sich heraus, dass eine Erweiterung ausgeführt wurde, die Facebook von allen Websites blockierte, die nicht Facebook sind. Deaktiviert es funktioniert!

2
Hosh Sadiq

Verwenden Sie ein setTimeout, da die FB.init manchmal etwas Zeit benötigt, um deklariert zu werden

function testAPI() {
     console.log('Welcome!  Fetching your information.... ');
     FB.api('/me', function(response) {
         console.log('Good to see you, ' + response.name + '.');
     });
}
function login() {
    FB.login(function(response) {
        if (response.authResponse) {
            testAPI();
        } else {
            // cancelled
        }
    });
}
setTimeout(function() {
    login();
},2000);
2
Allan Juliani

Um die Vorschläge von Mattys zu testen, dass FB nicht fertiggestellt werden kann, habe ich eine Warnung in das Skript eingefügt. Dies verursacht eine Verzögerung, die ich kontrollieren konnte. Sicher genug ... es war ein Timing-Problem.

    $("document").ready(function () {
        // Wait...
        alert('Click ok to init');
        try {
            FB.init({
                appId: '###', // App ID
                status: true, // check login status
                cookie: true, // enable cookies to allow the server to access the session
                xfbml: true  // parse XFBML
            });
        }
        catch (err) {
            txt = "There was an error on this page.\n\n";
            txt += "Error description: " + err.message + "\n\n";
            txt += "Click OK to continue.\n\n";
            alert(txt);
        }
        FB.Event.subscribe('auth.statusChange', OnLogin);
    });
1
Scott Savage

Ich hatte das gleiche Problem und die einzige Lösung, die ich fand, bestand darin, alles, was die FB-Anweisung verwendete, in das Init-Skript zu stellen. Ich verwendete auch asynchrones Laden. Die Callback-Funktion ist also alles, was einen FB benötigt. Ich habe eine gemeinsame Seite, die mit php geladen ist, so dass viele Teile unterschiedliche Facebook-Funktionen benötigen, die von PHP-Anweisungen gesteuert werden, wenn sie die Anweisungen beeinflussen. Wenn ich versuche, eine FB-Deklaration aus dem Ladeskript herauszunehmen, zeigt firefox die Meldung "FB ist nicht definiert" . Hoffe, es hilft in nichts.

1
Juan

Es gibt eine Lösung für Sie :)

Sie müssen Ihr Skript nach dem Laden des Fensters ausführen

wenn Sie jQuery verwenden, können Sie die einfache Methode verwenden:

<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>
1
manhhaiphp

Ich hatte das gleiche Problem und ich habe die Ursache gefunden.

Ich habe avast! Antivirus auf meinem Computer installiert, und ich wurde aufgefordert, das Update für Chrome Plugin zu installieren. Der neue avast! plugin for chrome verfügt über die Funktion zum Blockieren von Anzeigen und zum Tracking. Standardmäßig blockiert er den Facebook-Zugriff. Ich habe mein Problem gelöst, indem ich Facebook in avast erlaube! Chrome Plugin für die Website, die ich brauchte.

Da diese Frage sehr alt ist, denke ich, dass einige Leute dieselbe Ursache haben könnten wie ich, der neue Avast! Chrome Plugin.

1
Diego Malone

Versuchen Sie, Ihre Scripts in den Head-Abschnitt zu laden. Außerdem ist es besser, wenn Sie Ihre Scripts unter folgenden Aufrufen definieren: document.ready, wenn Sie diese Scripts im Hauptabschnitt definiert haben

1
Stoic

Ich hatte ein ähnliches Problem und es stellte sich heraus, dass es sich um Adblocker Pro handelt. Stellen Sie sicher, dass diese oder andere blockierende Erweiterungen deaktiviert sind. Ich verlor dadurch etwa 1 Stunde und 30 Minuten. Fühlen Sie sich wie ein Noob;)

0
rupert_b

Ich hatte das gleiche Problem. Die Lösung bestand darin, core.js anstelle von debug.core.js zu verwenden

0
Mangirdas

Facebook zieht es vor, dass Sie das SDK asynchron laden, sodass keine anderen Skripts blockiert werden, die Sie für Ihre Seite benötigen. Aufgrund der iframe besteht jedoch die Möglichkeit, dass die Konsole versucht, eine Methode für das FB-Objekt aufzurufen, bevor das FB-Objekt vollständig ist erstellt, obwohl der FB nur in der Funktion fbAsyncInit aufgerufen wird.
Versuchen Sie, das Javascript synchron zu laden, und Sie sollten den Fehler nicht mehr erhalten. Um dies zu tun, können Sie den von Facebook bereitgestellten Code kopieren und einfügen, ihn in eine externe .js-Datei einfügen und diese .js-Datei dann in einen <script>-Tag in den <head> Ihrer Seite einfügen. Wenn Sie ihr SDK asynchron laden müssen, prüfen Sie zuerst, ob der FB erstellt werden soll, bevor Sie die Funktion init aufrufen. 

0
Trevino Jarrett