2013-07-17 3 views
5

läuft habe ich eine Taste:Button-Callback-Funktion jede Seite zu laden

<span id="signinButton"> 
    <span 
    class="g-signin" 
    data-callback="onSignInCallback" 
    data-clientid="CLIENT_ID" 
    data-cookiepolicy="single_host_origin" 
    data-requestvisibleactions="http://schemas.google.com/AddActivity" 
    data-scope="https://www.googleapis.com/auth/plus.login"> 
    </span> 
</span> 

Bei Betätigung dieser läuft eine Funktion ... die im Moment losgeht, macht eine AJAX-Post, und druckt einen Text zurück in die Konsole (nur zu testen, ist dieser Teil funktioniert):

<script type="text/javascript"> 
var helper = (function() { 
    return { 
     onSignInCallback: function(data) { 

      var dataString = 'access_token=' + data['access_token']; 

      $.ajax({ 
       type: "POST", 
       url: "getdetails", 
       data: dataString, 
       dataType: 'html', 
       timeout: 0, 
       statusCode: { 
        200: function(data){ 
         console.log(data); 
        }, 
        error: function(data){ 
         console.log("There was an error"); 
        } 
       } 
      }); 
     } 
    }; 
})(); 

function onSignInCallback(data) { 
    helper.onSignInCallback(data); 
} 
</script> 

jedoch das Problem ist, dass jedes Mal, wenn ich die Seite aktualisieren, ohne auf die Schaltfläche klicken, meine Funktion läuft und die Daten werden über AJAX und der Text geschrieben wird in die Konsole gedruckt.

Eine Idee, warum das passiert? Ich will es (offensichtlich), also passiert das nur, wenn sie auf den Knopf klicken.

ich mit dem Google Plus-API gerade arbeitete, Code geändert von:

https://github.com/googleplus/gplus-quickstart-javascript/blob/master/index.html#L44

+0

Seltsam. Das passiert mir manchmal auch in Chrom. – turnt

Antwort

5

pro der Dokumentation dieser Richtlinie lautet:

Daten-Rückruf - eine Funktion im globalen Namensraum , die aufgerufen wird, wenn der Anmelde-Button gerendert wird und auch aufgerufen wird, nachdem ein Anmelde-Flow abgeschlossen ist. Wenn die Taste wiedergegeben wird der Rückruf erfolgt die Anwendung, ob der Benutzer vorher zu überprüfen, autorisierte und automatisch angemeldet werden soll.

von Entwurf läuft der Rückruf, wenn die Taste (dh Seite geladen wird) wiedergegeben wird und auch wenn die Schaltfläche angeklickt wird.

Eine Problemumgehung wäre, einen globalen Boolean beim ersten Lauf festzulegen.

<script type="text/javascript"> 
var first_run = true; 
var helper = (function() { 
    return { 
     onSignInCallback: function(data) { 

      var dataString = 'access_token=' + data['access_token']; 

      $.ajax({ 
       type: "POST", 
       url: "getdetails", 
       data: dataString, 
       dataType: 'html', 
       timeout: 0, 
       statusCode: { 
        200: function(data){ 
         console.log(data); 
        }, 
        error: function(data){ 
         console.log("There was an error"); 
        } 
       } 
      }); 
     } 
    }; 
})(); 

function onSignInCallback(data) { 
    if(!first_run) { 
     helper.onSignInCallback(data); 
    } 
    first_run = false; 
} 
</script> 
+0

Süße, die funktioniert. Ob dies der richtige Weg ist, Dinge mit der Google Plus API zu tun oder nicht, weiß ich nicht. Aber ja, es scheint jetzt zu funktionieren :) Danke. – Alias

2

In the Google Plus documentation:

Wenn der Benutzer zuvor Ihre Anwendung den Zugriff über diese Schaltfläche ermöglichen vereinbart oder eine andere Taste, um die gleiche Anwendung darstellen, werden sie automatisch angemeldet Die Callback-Funktion aufgerufen wird, automatisch. sobald der Anmelde-Button gerendert ist und ein neues Berechtigungsobjekt mit einem Zugriffs-Token übergeben wurde.

0

Ich bekam das auch. In meiner globalen onSignInCallBack (authResult) -Funktion habe ich den Aufruf eingeschlossen, der die Ajax-Anfrage in einer if-Anweisung durchführt, die nach einem Wert in authResult ['access_token'] sucht. Ich benutze AngularJs und habe meinen Ajax-Anruf in meinen Controller verschoben. Da Sie AngularJS nicht verwenden, können Sie die Zeile gplusController(). OnSignInCallback (..) durch Ihren AJAX-Aufruf ersetzen.

function onSignInCallback(authResult){ 
    if (authResult['access_token']) { 
    var afToken = document.getElementById('afToken').getAttribute('data-afToken'); 
    gplusController().onSignInCallback(authResult, afToken); 
    } 
}