5

我有一个按钮:

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

按下时,它会运行一个函数......此时它会关闭,发出 AJAX 帖子,并在控制台中打印一些文本(只是为了测试,这部分工作):

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

但是,问题是每次我在不单击按钮的情况下刷新页面时,我的函数都会运行,并且通过 AJAX 发布数据并将文本打印到控制台中。

知道为什么会这样吗?我想要它(显然)所以这只发生在他们点击按钮时。

我正在使用 Google Plus API,代码修改自:

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

4

3 回答 3

5

根据该指令的文档:

data-callback - 全局命名空间中的函数,在呈现登录按钮时调用,在登录流程完成后也会调用。呈现按钮时,会发生回调以检查用户是否先前授权应用程序并应自动登录。

按照设计,当按钮被渲染(即页面加载)以及按钮被点击时,回调将运行。

一种解决方法是在第一次运行时设置一个全局布尔值。

<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>
于 2013-07-17T18:28:23.643 回答
2

Google Plus 文档中

如果用户之前同意通过此按钮或代表同一应用程序的另一个按钮允许您的应用程序访问,则他们将自动登录。一旦呈现登录按钮并传递新的授权对象,就会自动调用回调函数带有访问令牌。

于 2013-07-17T18:29:47.023 回答
0

我也得到了这个。在我的全局 onSignInCallBack(authResult) 函数中,我将发出 ajax 请求的调用包含在 if 语句中,该语句检查 authResult['access_token'] 中的值。我正在使用 AngularJs 并将我的 Ajax 调用移到我的控制器中。由于您没有使用 AngularJS,您可以将 gplusController().onSignInCallback(..) 行替换为您的 AJAX 调用。

function onSignInCallback(authResult){
    if (authResult['access_token']) {
    var afToken = document.getElementById('afToken').getAttribute('data-afToken');
    gplusController().onSignInCallback(authResult, afToken);
   }
 }
于 2014-05-27T20:13:36.687 回答