2013-07-17 8 views
5

Ho un tasto:pulsante in esecuzione ogni caricamento della pagina

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

Se premuto, questo esegue una funzione ... che al momento si spegne, rende un posto AJAX, e stampa del testo nel la console (solo per testare, questa parte funziona):

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

Tuttavia, il problema è che ogni volta che aggiornare la pagina senza fare clic sul pulsante, le mie corse di funzione ed i dati è pubblicato tramite la tecnologia AJAX e il testo diventa stampato nella console.

Qualche idea sul perché questo sta accadendo? Lo voglio (ovviamente), quindi questo accade solo quando fanno clic sul pulsante.

sto lavorando con l'API Google Plus, codice modificato da:

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

+0

Strano. A volte succede anche a me in cromo. – turnt

risposta

5

Per la documentazione per tale direttiva:

dati-callback - Una funzione nel namespace globale , che viene chiamato quando viene eseguito il rendering del pulsante di accesso e viene chiamato anche dopo il completamento di un flusso di accesso. Quando il pulsante è resa la richiamata si verifica per controllare se l'utente autorizzato in precedenza l'applicazione e dovrebbe essere firmato automaticamente.

In base alla progettazione la richiamata verrà eseguito quando il pulsante è resa (cioè caricamento della pagina) e anche quando si fa clic sul pulsante.

Una soluzione alternativa sarebbe impostare un booleano globale alla prima esecuzione.

<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

Dolce che funziona. Se questo è il modo corretto di fare le cose con l'API di Google Plus o no, non lo so. Ma sì sembra che funzioni adesso :) Grazie. – Alias

2

In the Google Plus documentation:

Se l'utente in precedenza ha accettato di consentire l'accesso applicazione tramite questo pulsante, o un altro pulsante che rappresenta la stessa applicazione, vengono automaticamente registrati nella funzione di callback viene chiamato automaticamente. non appena viene eseguito il rendering del pulsante di accesso e viene passato un nuovo oggetto di autorizzazione con un token di accesso.

0

Stavo ottenendo anche questo. Nella mia funzione globale onSignInCallBack (authResult), ho allegato la chiamata che effettua la richiesta ajax in un'istruzione if che controlla un valore in authResult ['access_token']. Sto usando AngularJs e ho spostato la mia chiamata Ajax nel mio controller. Poiché non si utilizza AngularJS, è possibile sostituire la linea gplusController(). OnSignInCallback (..) con la chiamata AJAX.

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