我正在创建一个弹出窗口。当我完成了有关子窗口(弹出窗口)的工作并单击关闭按钮后,我需要调用父窗口的JavaScript函数。我怎样才能做到这一点。 我不是自己创建子窗口,而是显示其他一些URL的内容。如何在子关闭时调用父窗口的javascript函数?
回答
我不认为你可以得到一个事件,因为当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);
如果子窗口不是源于与父窗口相同的域名,则由于相同的源策略而被锁定。这是有意完成的,以防止跨站点脚本攻击(XSS)。
感谢您的信息 – biluriuday 2010-05-05 14:19:54
不要投票支持这一点。这只是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);
确实,你可以像这样命名你的函数,但这是有问题的:http://yura.thinkweb2.com/named-function-expressions/ - 我真的希望它能正常工作,但缺乏这种设施在Erlang真的,真的让我感到困扰! – Pointy 2010-05-05 14:32:27
我不认为这会导致你认为会造成的问题。 “超时”只能在“超时”功能的范围内访问。它相当于匿名函数:'function(){var timeout = arguments.callee;}' – 2010-05-05 14:58:24
嗯,似乎'setTimeout(函数fnName(){},n)'在Safari 2.x中显然会失败现在已经5岁了,而且相当不相关,IMO)。 – 2010-05-05 15:23:46
对不起,我的无知,但什么setTimeout(arguments.callee,100);呢?使超时递归? – biluriuday 2010-05-05 14:10:40
“arguments.callee”变量是对被调用函数的引用。所以,是的,它是递归的,除非它不是递归的,因为它不是调用它自己的函数,而是在另一个超时之后再次调用函数的Javascript运行时。你也可以用setInterval来设置它;我会输入一个例子。 – Pointy 2010-05-05 14:12:53
+1。 @Pointy,我发布了一个答案,它使用超时递归(ish)函数的命名闭包来避免使用arguments.callee。我会投票删除我的帖子,如果你更新你的。 :-) – 2010-05-05 14:15:02