2013-07-17 15 views
5

Mam przycisk:Przycisk Funkcja zwrotna działa za każdym strona załadowała

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

Po naciśnięciu tego uruchamia funkcję ... który w tej chwili gaśnie, sprawia, że ​​słupek AJAX i drukuje tekst z powrotem w konsola (tylko do testowania, ta część działa):

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

jednak problemem jest to, że za każdym razem, gdy odświeżenie strony bez klikania przycisku moje przebiegi funkcyjne, a dane są wysłane za pośrednictwem AJAX i tekst staje wydrukowane na konsoli.

Każdy pomysł, dlaczego tak się dzieje? Chcę tego (oczywiście), więc dzieje się tak tylko wtedy, gdy klikną przycisk.

Pracuję z API Google Plus Kod modyfikowany:

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

+0

Dziwne. Zdarza się to też czasami w chromie. – turnt

Odpowiedz

5

Per dokumentacji dla tej dyrektywy:

danych oddzwaniania - funkcja w globalnej przestrzeni nazw , która jest wywoływana, gdy przycisk logowania jest renderowany, a także wywoływany po zakończeniu przepływu logowania. Gdy przycisk jest renderowany wywołanie zwrotne następuje w celu sprawdzenia, czy użytkownik wcześniej upoważniony aplikację i powinny być automatycznie zalogowany.

Poprzez zaprojektowanie zwrotna zostanie uruchomiony, gdy przycisk jest wyświetlany (tj wczytywania strony), a także po kliknięciu przycisku.

Obejściem byłoby ustawienie globalnej wartości logicznej przy pierwszym uruchomieniu.

<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łodkie, które działa. Niezależnie od tego, czy jest to właściwy sposób robienia rzeczy za pomocą interfejsu API Google Plus, czy nie, nie wiem. Ale tak, wydaje się, że działa teraz :) Dzięki. – Alias

2

W the Google Plus documentation:

Jeśli użytkownik wcześniej uzgodnione, aby umożliwić dostęp aplikacji poprzez przycisk lub inny przycisk reprezentujący tę samą aplikację, są one automatycznie zalogowany Funkcja zwrotna jest wywoływana automatycznie. zaraz po wyrenderowaniu przycisku logowania i przekazaniu nowego obiektu autoryzacji z tokenem dostępu.

0

Otrzymałem to również. W mojej globalnej funkcji onSignInCallBack (authResult) dołączyłem wywołanie, które powoduje żądanie ajax w instrukcji if, która sprawdza wartość w authResult ['access_token']. Używam AngularJs i przeniosłem moje połączenie Ajax do kontrolera. Ponieważ nie używasz AngularJS, możesz zamienić linię gplusController(). OnSignInCallback (..) na połączenie AJAX.

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