检测用户在使用gapi.auth.authorize时是否关闭弹出窗口

时间:2013-04-05 09:23:27

标签: javascript

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

感谢。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

因此,Google的auth功能会返回承诺,而不是窗口。但是你可以将原始窗口包装到函数中,该函数将设置间隔,以检查打开的窗口是否已经关闭。

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

答案 2 :(得分:0)

这个问题已经存在了一段时间,但是当我调查这个问题时(我想在谷歌身份验证窗口打开时显示一个微调器,如果用户决定不进行身份验证则隐藏它),并发现这个问题抛出错误#。在它被抛出之前有两秒钟的延迟(有点长,Facebook很快就会出现),但确实有效。万岁,谷歌!

一些示例代码(angular 1.x),popup_closed_by_user是显示微调器的属性:

prompting