【问题标题】:How to call a javascript function of parent window when child is closed?关闭子窗口时如何调用父窗口的javascript函数?
【发布时间】:2011-02-15 22:55:28
【问题描述】:

我正在创建一个弹出窗口。在我完成子(弹出)窗口的工作并单击关闭按钮后,我需要调用父窗口的 javascript 函数。我怎样才能做到这一点。 我不是自己创建子窗口,而是显示其他一些 url 的内容。

【问题讨论】:

    标签: javascript javascript-events


    【解决方案1】:

    我不认为你可以得到一个事件,因为当 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);
    

    【讨论】:

    • 对不起我的无知,但是 setTimeout(arguments.callee, 100);做?使超时递归?
    • “arguments.callee”变量是对被调用函数的引用。所以,是的,它有点让它递归,除了它不是真正的递归,因为它不是调用自身的函数,而是在另一个超时之后再次调用函数的 Javascript 运行时。您也可以使用 setInterval 进行设置;我将输入一个示例。
    • +1。 @Pointy,我发布了一个答案,它对超时递归(ish)函数使用命名闭包以避免使用arguments.callee。如果您更新您的帖子,我将投票删除我的帖子。 :-)
    • 我使用了 window.clearInterval(interval);代替 cancelInterval ,它对我来说效果很好。谢谢
    【解决方案2】:

    如果子窗口不是来自与父窗口相同的域名,则由于同源策略,您将被锁定。这样做是为了防止跨站点脚本攻击 (XSS)。

    【讨论】:

      【解决方案3】:

      不要为此投票。这只是对 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);
      

      【讨论】:

      • 嗯,你可以这样命名你的函数是真的,但这是有问题的:yura.thinkweb2.com/named-function-expressions - 我真的希望它能够正常工作,而 Erlang 中缺乏这个工具真的让我很烦恼!
      • 我认为这不会导致您认为它会导致的问题。 “超时”只能从“超时”函数的范围内访问。相当于匿名函数:function(){var timeout = arguments.callee;}
      • 嗯,看来setTimeout(function fnName(){}, n) 在 Safari 2.x 中显然会失败(现在已经 5 岁了,而且完全不相关,IMO)。
      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多