Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在尝试处理子窗口上的关闭窗口事件_Javascript_Jquery - Fatal编程技术网

Javascript 正在尝试处理子窗口上的关闭窗口事件

Javascript 正在尝试处理子窗口上的关闭窗口事件,javascript,jquery,Javascript,Jquery,我有一个打开新窗口的网站。我试图在子窗口上触发onclose事件(如果用户关闭了窗口,父窗口将向其发出警报) 我在以下位置发现了有关该问题的stackoverflow问题: 但是,答案也会在子窗口上执行操作,我认为我不能这样做,因为子窗口打开的网站不在我的控制范围内(我不能编辑它的html) 我正在考虑使用以下命令来触发on close事件 var inFormOrLink; $('a').live('click', function() { inFormOrLink = true; }); $

我有一个打开新窗口的网站。我试图在子窗口上触发
onclose
事件(如果用户关闭了窗口,父窗口将向其发出警报)

我在以下位置发现了有关该问题的stackoverflow问题:

但是,答案也会在子窗口上执行操作,我认为我不能这样做,因为子窗口打开的网站不在我的控制范围内(我不能编辑它的html)

我正在考虑使用以下命令来触发on close事件

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink;
})

如何在新选项卡/窗口上应用此功能?

仅在客户端是不可能的。 为此,您需要执行以下操作:

  • 打开选项卡时,向脚本发送一个ajax调用,该脚本在收到第二个ajax调用之前不会停止加载,这通常是通过在输出之前等待sql值存在的脚本完成的
  • 关闭选项卡后,向该脚本发送第二个ajax调用,以便它响应原始ajax调用
中提琴

我不知道有什么更简单的方法可以做到这一点

原始窗口:

function waitForTabClose(windowID) {
    $.post('waitfortabclose.php',{windowID:windowID},function(data) {
        if (data == 1) { 
             // Do tab closed stuff
        } else {
            waitForTabClose(windowID);
        }
    });
}
waitfortabclose.php

$i=1;
$wID = $_POST['windowID'];
do {
    if (file_get_contents($wID) == $wID) {
        echo 1;exit;
    }
    set_time_limit(30);
    sleep(5);
} while($i++ < 50);
echo 0;
$wID = $_POST['windowID'];
file_put_contents($wID,$wID);
windowclosed.php

$i=1;
$wID = $_POST['windowID'];
do {
    if (file_get_contents($wID) == $wID) {
        echo 1;exit;
    }
    set_time_limit(30);
    sleep(5);
} while($i++ < 50);
echo 0;
$wID = $_POST['windowID'];
file_put_contents($wID,$wID);

这是伪代码,还没有经过测试。这个功能可以用很多种方式编写,我就是这么做的。

找到了我所寻找的解决方案。这比上面的答案再加上它的实际效果和我想要的要容易得多

var win = open('http://www.google.com');
if (win.closed) {
    alert('Window closed! Hoorah!');
}

非常感谢尝试帮助的人。

这不需要我也控制第二个弹出窗口(服务器端)吗?弹出窗口通常加载其他网站,这意味着我无法在服务器端更改任何内容。老实说,我认为这是不可能的。您需要通过服务器在windows之间进行通信,如果没有,则没有任何方法。Korin感谢您的所有帮助和其他解决方案,但找到了查看我的回答我找到了一些可能有用的方法,但他们再次在子窗口上执行操作。你可以控制子窗口加载的原始站点吗?是的,我可以控制父站点(原始站点),我不能控制子站点,但是如果有办法将功能添加到子窗口,那么我可以做一些事情。