2010-05-05 94 views

回答

9

我不认为你可以得到一个事件,因为当URL来自不同的域时你不能混淆文档本身。但是,您可以轮询,检查窗口对象的“关闭”属性:

var w = window.open("http://what.ever.com", "OtherWindow"); 
setTimeout(function() { 
    if (w.closed) { 
    // code that you want to run when window closes 
    } 
    else 
    setTimeout(arguments.callee, 100); 
}, 100); 

你也可以,如果你喜欢启动间隔定时器:

var w = window.open("http://what.ever.com", "OtherWindow"); 
var interval = setInterval(function() { 
    if (w.closed) { 
    // do stuff 
    cancelInterval(interval); 
    } 
}, 100); 
+0

对不起,我的无知,但什么setTimeout(arguments.callee,100);呢?使超时递归? – biluriuday 2010-05-05 14:10:40

+1

“arguments.callee”变量是对被调用函数的引用。所以,是的,它是递归的,除非它不是递归的,因为它不是调用它自己的函数,而是在另一个超时之后再次调用函数的Javascript运行时。你也可以用setInterval来设置它;我会输入一个例子。 – Pointy 2010-05-05 14:12:53

+0

+1。 @Pointy,我发布了一个答案,它使用超时递归(ish)函数的命名闭包来避免使用arguments.callee。我会投票删除我的帖子,如果你更新你的。 :-) – 2010-05-05 14:15:02

0

如果子窗口不是源于与父窗口相同的域名,则由于相同的源策略而被锁定。这是有意完成的,以防止跨站点脚本攻击(XSS)。

+0

感谢您的信息 – biluriuday 2010-05-05 14:19:54

0

不要投票支持这一点。这只是Pointy的代码改进,以摆脱arguments.callee。为Pointy投票。

var w = window.open("http://what.ever.com", "OtherWindow"); 
setTimeout(function timeout() { 
    if (w.closed) { 
    // code that you want to run when window closes 
    } 
    else 
    setTimeout(timeout, 100); 
}, 100); 
+0

确实,你可以像这样命名你的函数,但这是有问题的:http://yura.thinkweb2.com/named-function-expressions/ - 我真的希望它能正常工作,但缺乏这种设施在Erlang真的,真的让我感到困扰! – Pointy 2010-05-05 14:32:27

+0

我不认为这会导致你认为会造成的问题。 “超时”只能在“超时”功能的范围内访问。它相当于匿名函数:'function(){var timeout = arguments.callee;}' – 2010-05-05 14:58:24

+0

嗯,似乎'setTimeout(函数fnName(){},n)'在Safari 2.x中显然会失败现在已经5岁了,而且相当不相关,IMO)。 – 2010-05-05 15:23:46