it-swarm.com.de

Die FB-Init-Funktion gibt einen falschen Versionsfehler aus

Ich verwende die Facebook-JS-SDK und habe heute eine neue App erstellt. Alles ist richtig konfiguriert und die Init-Funktion wie folgt:

window.fbAsyncInit = function() {
    FB.init({
      appId      : 'xxxx', // App ID
      status     : false, 
      version:  'v2.0',
      cookie     : true, 
      xfbml      : false  // parse XFBML
    });
};

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

aber ich habe einen Fehler: "Nicht erfasste Fehler: init wurde nicht mit gültiger Version aufgerufen" Versuchte auch andere Versionen wie: 2.1, 2.2 und trotzdem kein Glück . Was mache ich hier falsch?

46
abiku

** Haftungsausschluss - Dies ist reine Spekulation. Scheint mein Problem gelöst zu haben.


Ich hatte dieses Problem bei einem aktuellen Projekt. Ich denke, das ist ein Latenzproblem. Das Facebook SDK erfordert, dass sich <div id="fb-root"></div> auf der Seite befindet. Dies sollte das erste sein, was nach dem öffnenden Body-Tag steht. Danach sehen Sie möglicherweise Ihren Initialisierungscode.

Für mich war dieses Problem nicht konsistent. Ich habe gelegentlich den Fehler gesehen und manchmal nicht. Daher ist meine Schlussfolgerung, dass es sich um ein Latenzproblem handelt. Wenn das SDK den fb-root nicht finden kann, muss es einen erstellen. Hier glaube ich, dass das Problem der Latenz besteht.

Fügen Sie diese unmittelbar nach dem öffnenden Body-Tag hinzu, jedoch vor der FB.init({});.

<div id="fb-root"></div>

Dies scheint das Problem für mich gelöst zu haben und wird hoffentlich auch anderen helfen. Die v1.0-Dokumentation erläutert den Grund für fb-root, aber die Dokumente der Version 2.0 enthalten keine Erwähnung des Elements, wahrscheinlich weil das Init-Skript es für Sie hinzufügt, wenn es es nicht findet.

32
Matt Wagner

Ich habe es mit all.js anstatt sdk.js zum Laufen gebracht 
In Ihrem Fall würde es so aussehen:

js.src = "//connect.facebook.net/pl_PL/all.js";

anstatt 

js.src = "//connect.facebook.net/pl_PL/sdk.js";
22
n_y

Fügen Sie &version=v2.0 wie folgt zu js.src hinzu:

(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#xfbml=1&version=v2.0";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
11
Mythical Fish

Dieses Problem plagte mich eine Weile. Ich habe viele der hier aufgeführten Ideen ausprobiert, z. B. die Versionsnummer ändern und den fb-root verschieben/entfernen.

Was für mich schließlich gut funktioniert, ist, die gesamte window.fbAsyncInit-Funktion zu löschen und die init-Eigenschaften im Hash von sdk.js anzugeben. Zum Beispiel:

<script type="text/javascript">
    (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 = "https://connect.facebook.net/en_US/sdk.js#version=v2.2&appId=12345&status=true&cookie=true&xfbml=true";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
</script>

Natürlich können Sie einen Parameter auslassen, um seinen Standardwert zu verwenden.

Ich kann diesen Ansatz nirgendwo dokumentieren, also auf eigenes Risiko. Glücklicherweise habe ich eine ältere Site von v1.x auf v2.x aktualisiert und diese Methode beim Laden von all.js verwendet.

5
WimpyProgrammer

ich habe das ersetzt

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

mit diesem

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

und gearbeitet :)

5
saadk

Dies geschah auch mir mit großer Inkonsistenz. Irgendwo sagte meine Ahnung, es muss ein Timing-Problem sein. Beim Debuggen wurde ein Fehler in der Entwicklerkonsole durch manuelles Ausführen von "FB.login()" festgestellt. Der Fehler sagte " init wurde nicht mit gültiger Version " aufgerufen.

In meinem Fall fügte ich //connect.facebook.net/en_US/sdk.js als Skript-Tag in den Header der HTML-Seite ein und der window.fbAsyncInit kam gleich danach in eine andere Datei. Dies war für mich ein Timing-Problem und daher habe ich diese beiden Skript-Tags ausgetauscht. Nun hatte ich einmal window.fbAsyncInit vor //connect.facebook.net/en_US/sdk.js eingefügt, das Problem war jedoch verschwunden. Hoffe das hilft anderen.

3

Dies war das einzige Update, das den Fehler zu 100% der Zeit beseitigte.

Sie können diesen Fehler erneut erstellen, indem Sie Ihre FB.init löschen. Dies bestätigt, dass, obwohl die sdk.js geladen wurde und der FB-Namespace vorhanden war, FB.init nicht aufgerufen wurde, als wir versuchten, FB-Methoden an anderer Stelle in unseren Skripts zu verwenden.

Wir müssen also sicherstellen, dass FB.init aufgerufen wurde. Ich habe einen ähnlichen Ansatz für diese Antwort verwendet:

if (typeof(fbApi) === 'undefined') { fbApi = {}; }
fbApi = (function () {

    var fbApiInit = false;

    var awaitingReady = [];

    var notifyQ = function() {
        var i = 0,
            l = awaitingReady.length;
        for(i = 0; i < l; i++) {
            awaitingReady[i]();
        }
    };

    var ready = function(cb) {
        if (fbApiInit) {
            cb();
        } else {
            awaitingReady.Push(cb);
        }
    };

    window.fbAsyncInit = function () {
      FB.init({
        appId  : '<?php echo esc_js( $facebook_app_id ); ?>',
        status : true,
        cookie : true,
        xfbml  : true,
        version: 'v2.0'
      });

      fbApiInit = true;
      notifyQ();
    };

    return {
        /**
         * Fires callback when FB is initialized and ready for api calls.
         */
        'ready': ready
    };

})();

        (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'));

An anderer Stelle kann dann jeder Verweis auf FB wie folgt gemacht werden:

        fbApi.ready(function() {
          FB.XFBML.parse($("#fb-comments"));
        });
2
StuR

Versuchen Sie diesen Code:

setInterval(
function() { FB.api('/me/', 
    function(r) { console.log('response: ', r); })
}, 5000);

Mir ist dann aufgefallen, wenn ich versuche, info fb ​​noch nicht initialisiert zu bekommen.

Ich habe es behoben, indem ich meinen Initialisierungscode am Ende von hinzugefügt habe:

FB.getLoginStatus(function(response) { init(); });
1
Tahimoto

Ich habe diesen Fehler behoben, indem ich das Skript auf das Dokument bereit statt auf das Laden des Dokuments geladen habe. 

Zum Beispiel gab der Fehler etwa 10% der Zeit an:

$(window).load(function(){
  (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'));
});

während dies ständig funktioniert:

$(window).ready(function(){
  (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'));
});
1
afessler

Achten Sie darauf, wenn Sie die FB-API nach dem Aufruf aufrufen. Init scheint synchron zu sein, aber window.fbAsyncInit ist dies nicht, daher müssen Sie auf seine Ausführung warten. Mein zu reproduzierendes Beispiel ist in phonegap browser platform, aber nachdem ich den Facebook-Plugin-Code überprüft habe, bin ich sicher, dass er auch in reiner Javascript-Umgebung reproduziert werden kann. 

Dies war mein Code, der den Fehler auslöst:

if (window.config.debug_mode) {
    facebookConnectPlugin.browserInit('xxxxxxxxx', function() {
    });
}
// getLoginStatus is wrong here as window.fbAsyncInit is not yet completed
facebookConnectPlugin.getLoginStatus(function(status) {
    alert('logged: ' + JSON.stringify(status));
}, function(error) {
    alert('error: ' + JSON.stringify(error));
});

So habe ich es behoben:

if (window.config.debug_mode) {
    facebookConnectPlugin.browserInit('xxxxxxxxx', function() {
        facebookConnectPlugin.getLoginStatus(function(status) {
            alert('logged: ' + JSON.stringify(status));
        }, function(error) {
            alert('error: ' + JSON.stringify(error));
        });
    });
}

Ich bin mir sicher, dass der folgende Code im Browser angezeigt wird, aber ich habe keine Zeit, ihn zu überprüfen:

window.fbAsyncInit = function fbAsyncInit () {
    version = version || 'v2.6'

    FB.init({
        appId: appId,
        xfbml: false,
        version: version
    })
}
// now calling any FB function here will rise this error
1
user732456

Stellen Sie sicher, dass Sie https:// in der URL verwenden

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

Ich hätte das auch nicht geglaubt, aber der einzige Unterschied zwischen dem, was Facebook in seinem aktuellen Beispielcode hat und dem, was ich habe, ist https:// anstelle von // für die URL.

Das Update auf https: // scheint das Problem behoben zu haben und ich kann den Fehler nicht wiederholen.

Wenn Sie an anderer Stelle in Ihrem Code prüfen, ob FB definiert ist, überprüfen Sie if (window.FB) und nicht if (FB). Andernfalls erhalten Sie eine Fehlermeldung.

// call after manually adding DOM nodes containing FB widgets
if (window.FB)
{
    window.FB.XFBML.parse()
}

Wenn Sie TypeScript verwenden, müssen Sie Folgendes hinzufügen:

interface Window
{
    FB: IFacebook;
}

interface IFacebook
{
    XFBML: any;
    ui: any;
    getLoginStatus(callback: (response: { status: string }) => any);
    login(callback: (response) => any, options: any);
    logout(callback: () => any);
    Event: any;
    api(url: string, callback: (response: any) => any);
}
0
Simon_Weaver

SINGLE INCLUDE: Stellen Sie sicher, dass die Facebook-JavaScript-API nicht mehrmals auf Ihrer Seite enthalten ist. 

(Das war mein Problem)

0
redolent

Ich hatte das gleiche Problem, als ich versuchte, einen einfachen Facebook-Post in einen Artikel einzubetten, den ich gerade schrieb.

<div id="fb-root"></div><script>(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#xfbml=1&amp;version=v2.3";  fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));</script><div class="fb-post" data-href="https://www.facebook.com/feyenoord/posts/10153224326681816:0" data-width="500"><div class="fb-xfbml-parse-ignore"><blockquote cite="https://www.facebook.com/feyenoord/posts/10153224326681816:0"><p>Een teleurstellende middag in De Kuip. Ook ADO Den Haag bleek vanmiddag te sterk voor Feyenoord. http://bit.ly/1UA3ZxZADO Den Haag too strong for Feyenoord. http://bit.ly/1UA6rEN</p>Posted by <a href="https://www.facebook.com/feyenoord/">Feyenoord Rotterdam</a> on&nbsp;<a href="https://www.facebook.com/feyenoord/posts/10153224326681816:0">Sunday, January 31, 2016</a></blockquote></div></div>

Beim Debuggen des Facebook sdk.js habe ich gesehen, dass die .getVersion "undefined" zurückgegeben hat und das Widget daher nicht gerendert wird.

Anscheinend kann Facebook beim Übergeben von &amp; nicht mit der Weitergabe von Abfrageparametern umgehen, die durch & anstelle von sdk.js getrennt sind. Ich hatte meinen Code aus Validierungsgründen in &amp; geändert.

Works:        js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.3";
Doesn't Work: js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&amp;version=v2.3";

 Facebook sdk debug getVersion

0
JeroenVdb

Der Fehler trat jedes Mal auf, wenn ich auf eine Seite (Edge Browser) umgeleitet wurde, die über ein FB-Page-Plugin verfügte. 

Wenn ich die Seite aktualisiert habe, würde es funktionieren. Wenn ich durch einen Hyperlink dorthin kam, würde dies den Fehler werfen.

Behebung des Problems durch Hinzufügen von sdk.js?d=" + new Date().toISOString(); zum Skript.

(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?d=" + new Date().toISOString();
        fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
0
adrianvlupu

Für Einzelseitenanmeldungen (In meinem Fall reagieren)

In Einzelseitenanwendungen haben Sie weniger Kontrolle über die Reihenfolge, in der der Code ausgeführt wird. Manchmal wird das Skript geladen, wenn Sie Ihren Code aufrufen, manchmal nicht.

Damit es funktioniert, unabhängig davon, ob das Facebook-Skript bereits geladen wurde oder nicht, überprüfe ich, ob die globale Variable FB zum Zeitpunkt der Code-Ausführung bereits definiert ist. Wenn ja, mache ich einfach eine normale Initialisierung, ansonsten gebe ich den Rückruf.

Das ist mein Code:

export function initializeFacebookSdk() {

  /* Asynchronous flow: if the global 'FB' variable is still undefined,
     then the facebook script hasn't loaded yet, in that case, provide
     a global callback that will be called by the facebook code. If the 
     variable is already present, just call the code right away and forget
     about the callback. */
  if(window.FB === undefined) {
    console.log('FB undefined -> provide callback');
    window.fbAsyncInit = function() {
      initialize();
    };
  }
  else {
    console.log('FB defined -> call init right away');
    initialize();
  }

  function initialize() {
    window.FB.init({
      appId      : '492331311256888',
      cookie     : true,
      xfbml      : true,
      version    : 'v3.2'
    });    
  }
}

In meiner HTML-Datei stelle ich nur das von Facebook bereitgestellte Skript zur Verfügung, und in meinem Code kann ich initializeFacebookSdk() aufrufen, wo und wann immer ich möchte:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>My application</title>
  </head>
  <body>    
    <noscript>
      You need to enable JavaScript to run this app.
    </noscript>

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

    <div id="root"></div>
  </body>
</html>
0
Alexander Derck

Wir verwenden unsere eigene API, die dies tut

   _loadFacebookApi: function(callback) {
        logger.info('_loadFacebookApi');

        (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 = "https://connect.facebook.net/en_US/sdk.js";


        }(document, 'script', 'facebook-jssdk'));

        var fbScript = window.document.getElementById('facebook-jssdk');

        fbScript.onload = fbScript.onreadystatechange = (function() {

            logger.info('fbScript onLoad');

            window.FB.init({
                version: 'v2.1',
                appId: '',
                channelUrl: '/fbchannel.html',
                status: false,
                cookie: true,
                xfbml: true,
                logging: true,
                oath: true
            });

            this.dispatch(constants.FACEBOOK_INIT_SUCCESS);

            if(callback){
                callback();
            }

        }.bind(this));

    }
0
4m1r

Ich hatte das gleiche Problem und ich glaube, ich habe die Ursache gefunden!

Ursache

In meinem Fall haben wir FB SDK dynamisch auf die Website unseres Kunden injiziert. Einige unserer Kunden haben jedoch bereits FB SDK über andere Plugins hinzugefügt. Diese Plugins haben unterschiedliche App-IDs und Versionen.

Abhängig von der Latenz rufen einige Plugins init vor/nach unserem auf

Lösung

Wenn Sie der Eigentümer der Site sind, auf der Sie das SDK einschleusen, stellen Sie sicher, dass keine anderen Plug-ins das FB SDK einschleusen und init eine andere Version und App-ID aufrufen

Wenn Sie die Site nicht besitzen, versuchen Sie zumindest, das SDK vor allen anderen zu injizieren, und bevorzugen Sie not async

Das habe ich auch FB gemeldet. Sie sagten, init nicht einzeln aufzurufen, sondern init-Parameter direkt in der Regel zu übergeben. Ich habe den Code angehängt, den ich benutze:

if (!document.getElementById("fb-root")) {
      // create div required for fb
      const fbDiv = document.createElement("div");
      fbDiv.id = "fb-root";
      document.body.appendChild(fbDiv);
      // Run any script after sdk is loaded
      window.fbAsyncInit = () => {
        //
      };
      // inject sdk.js
      (function(d, script) {
        script = d.createElement("script");
        script.type = "text/javascript";
        script.async = true;
        script.src =
          "https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v3.2&appId=" +
          process.env.REACT_APP_FB_APP_ID +
          "&autoLogAppEvents=1";
        d.getElementsByTagName("head")[0].appendChild(script);
      })(document);
    }

0
Gijo Varghese

Sie verwenden das Plug-in cordova-plugin-facebook4. Dies ist eine benutzerdefinierte Fehlermeldung, die besagt, dass die Init noch nicht abgeschlossen ist, wenn die Facebook-API-Funktion aufgerufen wird. Da das Plugin mit setTimeout keine waitForInitialize gibt und dann die api-Methode erneut versucht, ist die beste Wette.

var retryFunc = (iteration) => {
    return new Promise((s, f) => facebookConnectPlugin.getLoginStatus(s, f))
    .then(authentication => authentication.status === 'connected')
    .then(isLoggedIn => {
        /* Your Code Here */
    })
    .catch(failure => {
        console.log(`Waiting for Facebook Init. Iteration: ${iteration || 0}`);
        if((iteration || 0) < 10) { 
            return new Promise((s, setTimeout(() => s(), 1000)
            .then(() => retryFunc(null, (iteration || 0) + 1);
        }
        else { return Promise.reject({Error: 'Failed to check login status.', Detail: failure}); }
    });
};

retryFunc();
/* Or replace getLoginStatus with your api call. */
0
Warren Parad