如何从https弹出窗口重新加载http window.opener?

时间:2010-08-10 15:35:44

标签: javascript http https cross-domain xss

我有一个http窗口,打开一个安全的弹出框,将表单提交给第三方网站。弹出窗口关闭后,我想重新加载开启器,以便它反映表单提交的结果。

由于opener和popup使用不同的协议(http和https),我不能以简单的方式(window.opener.location.reload())来完成。还有另外一种方法吗?我是否必须冒险进入JSONP?

2 个答案:

答案 0 :(得分:2)

Kludgy方式:设置超时以检查打开的弹出窗口是否已关闭。

function checkClosed(){
    if(new_win.closed){
        alert('Window was closed');
    }
    else{
       window.setTimeout(checkClosed,1000);
    }
} 

new_win = window.open('about:blank');
window.setTimeout(checkClosed,1000);

答案 1 :(得分:1)

我知道这是一个非常古老的问题,但我找到了一个更好的方法:Cross-document messaging

$('a#popup').on('click', function(event) {
    event.preventDefault();
    $this = $(this);
    authenticationWindow = window.open($this.href, 'authenticationPopup');
});

window.addEventListener('message', function (evt) {
    // simplified, should check for matching event.origin
    if (event.data == 'OK' && event.origin == window.location.protocol+'//'+window.location.host) {
        authenticationWindow.close();
    }
});

虽然从弹出窗口(当然如果你控制它,至少是最后一页),你需要这个:

opener.postMessage('OK', window.location.protocol+'//'+window.location.host);

这将关闭弹出窗口,并允许您执行其他操作,例如通过Ajax更新数据或重新加载页面。