如何在window.opener上附加事件

问题描述

| 我有一个被打开的窗口
var myWindow = window.open(
                  \'popupManager.htm\',\'myWindow\',\'status=0,toolbar=0,width=500,height=100\');
它将充当调试窗口。 在内部,我想连接到
window.opener
上的Windows事件,但无法正常工作。这两个URL位于相同的域/相同的网站中。 我可以使用DOM元素,例如
$(\"input[soid=Dlgbuttonbar_cancelButton]\",window.opener.document).bind(\"click\",function() {
    alert(\'Cancel button was pressed!\');
    window.close();
});
但是我想参加
move
事件(
window.onMove
)和
close
事件。 试过了
window.opener.addEventListener(\'move\',function() { console.log(\'moving...\'); });
没有运气。 诀窍是什么?使用jQuery或简单的javascript ...     

解决方法

监听窗口事件似乎无效。我使用此技巧来监听窗口事件(以我的情况为例): 在父文档(例如您要从中获取事件的文档)上创建一个文档元素(例如span):
var $unloader = $(\'<span style=\"display:none;\" id=\"unloader\"></span>\');
$(\'body\').prepend($unloader\');    
$(window).unload(function(){$(\'#unloader\').click();});
在打开的文档(例如弹出窗口)中,您可以收听现在被屏蔽为click事件的unload事件:
$(\"#unloader\",window.opener.document).click(unloadEventHandler);
如果您需要检测卸载是关闭还是导航事件,则可以在延迟后检查父项的close属性:
    window.setTimeout(function(){
        if(window.opener.closed == true) {
             // Close event
        } else {
            // Navigation event
            // window.opener.location to get new location
        }
    },500);
风险在于延迟,在执行unload方法和事件挂钩后更改了closed属性,因此,如果延迟太短,您可能会在更改之前获得该标志;如果延迟太长,则会得到不必要的延迟。 我认为move事件可以类似地处理,希望这会有所帮助。让我知道此方法是否有任何可能的改进。谢谢,祝你好运。