2013-04-05 68 views
3

使用gapi.auth.authorize函数,用户可以在不点击任何选项(不接受或拒绝按钮)的情况下关闭弹出框。当这种情况发生时,我的回调函数不会触发,所以我无法处理这种情况。解决这种情况的方法是什么?检测用户是否在使用gapi.auth.authorize时关闭弹出框

谢谢。

+0

什么选项都设置在新窗口中打开。我需要在新窗口中打开使用gapi – 2015-04-28 17:56:45

+0

你知道吗? – 2015-07-28 10:20:30

回答

0

他们似乎没有提到它在任何文档中,但gapi.auth.authorize()返回弹出Window。因此,您可以保存返回的Window并设置间隔或超时以检查Window.closed

+1

嗯,它看起来像返回值是未定义的 – Karussell 2013-09-30 08:56:40

+1

它看起来像返回值是一个承诺:(这当然不是弹出对象。 – VitalyB 2014-09-16 11:46:06

0

所以你从谷歌身份验证功能返回承诺,而不是一个窗口。但是,你可以将原始窗口包装到函数中,该函数将设置间隔,以检查已打开的窗口是否已关闭。

// variable to store our deferred object 
var authDefer = null; 

function auth() { 

    // right before the auth call, wrap window.open 
    wrap(); 
    // Call auth 
    authDefer = window.gapi.auth.authorize({ 
     client_id: ..., 
     scope: ..., 
     immediate: ... 
    }).then(
     // onSuccess, 
     // onReject, 
     // onNotify 
    ); 
} 

function wrap() { 
    (function(wrapped) { 
     window.open = function() { 
      // re-assign the original window.open after one usage 
      window.open = wrapped; 
      var win = wrapped.apply(this, arguments); 
      var i = setInterval(function() { 
       if (win.closed) { 
        clearInterval(i); 
        if (authDefer) { 
         authDefer.cancel(); 
        } 
       } 
      }, 100); 
      return win; 
     }; 
    })(window.open); 
} 

取自Google论坛上的其中一个主题。真的有用。

External link to Source

0

这个问题已经有一段时间了,但是当我看着这个问题(我想说明一个微调,而谷歌的认证窗口打开,并隐藏它,如果用户决定不进行身份验证),并发现gapi正在抛出一个错误popup_closed_by_user。在被抛出之前,有两秒钟的延迟(这很长,Facebook是即时的),但它确实有效。 Hooray,谷歌!

一些示例代码(角1.x中),prompting是显示微调属性:

_google_obj.prompting = true; 
gapi.auth2.getAuthInstance().signIn().then(function(googleResponse){ 
    var token = googleResponse.getAuthResponse().id_token; 
    SVC_exec_.post('/q/goog', 1000, { token: token }, 'signing you in through Google', function (response) { 
     if (response.code === 'ok') { 
      // update the UI 
     } 
     _google_obj.prompting = false; 
    }); 
}, 
function(error){ 
    $timeout(function() { 
     console.log('user probably closed the google popup window: '+error); 
     _google_obj.prompting = false; 
    }); 
});