2013-04-05 70 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; 
    }); 
});