2014-12-06 46 views
1

我在我的網站上實施了外部OAuth身份驗證。 按鈕點擊我打開彈出與我們的Facebook的授權頁面。 現在我需要知道何時完成認證以讀取OAuth令牌並關閉彈出窗口。當打開的彈出窗口的位置發生變化時收到通知

click: function() { 
    var popup = window.open(url, title, '<options>'); 
    popup.onload = function() { 
     //1. if url contains token - finish OAuth authentication 
     //2. close popup 

     //but 'onload' doesn't work for external domains 
    } 
    return false; 
}, 

當我嘗試使用輪詢技術,我hetting以下安全錯誤訪問:

Uncaught SecurityError: Blocked a frame with origin " https://some_app_host_not_the_same_as_following.com " from accessing a frame with origin " https://some_auth_host_which_works_with_facebook.com ". Protocols, domains, and ports must match.

我怎樣才能做到這一點?

+0

可能重複(http://stackoverflow.com/questions/3291712/is-it-possible-to- open-a-popup-javascript-and-then-detect-when-the-user-clo) – rfornal 2014-12-06 02:33:44

回答

2

如果您可以控制彈出窗口的內容,請處理窗口的卸載事件,並通過opener屬性通知原始窗口,首先檢查開啓程序是否已關閉。請注意,這不會在Opera中始終有效。

window.onunload = function() { 
    var win = window.opener; 
    if (win.closed) { 
     win.someFunctionToCallWhenPopUpCloses(); 
    } 
}; 

因爲每當用戶在彈出的頁面導航離開,而不只是在關閉窗口,你應該檢查彈出已someFunctionToCallWhenPopUpCloses實際關閉卸載事件將觸發:

var popUp = window.open("popup.html", "thePopUp", ""); 
function someFunctionToCallWhenPopUpCloses() { 
    window.setTimeout(function() { 
     if (popUp.closed) { 
      alert("Pop-up definitely closed"); 
     } 
    }, 1); 
} 

如果您不能控制彈出窗口的內容,或者您​​的某個目標瀏覽器不支持卸載事件,那麼您可以簡化爲主窗口中的某種輪詢解決方案。調整適合的時間間隔。

var win = window.open("popup.html", "thePopUp", ""); 
var pollTimer = window.setInterval(function() { 
    if (win.closed !== false) { // !== is required for compatibility with Opera 
     window.clearInterval(pollTimer); 
     someFunctionToCallWhenPopUpCloses(); 
    } 
}, 200); 
的[是否有可能打開一個彈出用JavaScript,然後當用戶關閉它檢測?]
+0

我已經實現了輪詢解決方案,不幸的是無法讀取打開的彈出窗口的位置屬性。訪問被拒絕錯誤:/ – 2014-12-06 03:23:15

相關問題