【问题标题】:How to run function of parent window when child window closes?子窗口关闭时如何运行父窗口的功能?
【发布时间】:2010-12-19 04:05:14
【问题描述】:

我正在调用 javascript window.open() 函数以在弹出窗口中加载另一个 url。用户完成后,它会将他们带到最后一个页面,该页面有一个链接,上面写着关闭窗口,该窗口调用 window.close() 函数。现在,当该页面关闭时,我需要更新打开窗口的原始页面中的某些内容。有没有办法做到这一点?我必须调用原始页面中的函数。

【问题讨论】:

标签: javascript window


【解决方案1】:

你可以试试这个:

生成的窗口:

window.onunload = function (e) {
    opener.somefunction(); //or
    opener.document.getElementById('someid').innerHTML = 'update content of parent window';
};

父窗口:

window.open('Spawn.htm','');
window.somefunction = function(){

}

你不应该在父级上这样做,否则 opener.somefunction() 将不起作用, 做 window.somefunction 使 somefunction 成为公共的:

function somefunction(){

}

【讨论】:

  • +1,在正确的时间帮助了我。编写 window.somefunction = function{ .... } 与编写 function somefunction() { .... } 相同
  • 如果生成的窗口和父窗口不是来自同一个域,这在 IE 上不起作用
  • 感谢您的精彩回复。但此代码不适用于 IE。这在 IE 浏览器上是如何工作的。
  • 谢谢,这正是我一直在寻找的。它适用于我的 FF 和 IE。
  • 太好了,成功了
【解决方案2】:

随着jerjer answer(top),有时在你的父窗口和子窗口不是都是外部的或不是内部的你会看到一个未定义的opener问题,你不能访问父页面属性,见window.opener is undefined on Internet Explorer

【讨论】:

    【解决方案3】:

    这是一个旧帖子,但我想我会添加另一种方法来做到这一点:

    var win = window.open("http://www.google.com");
    
    var winClosed = setInterval(function () {
    
        if (win.closed) {
            clearInterval(winClosed);
            foo(); //Call your function here
        }
    
    }, 250);
    

    您不必修改内容或使用子窗口中的任何事件处理程序。

    【讨论】:

      【解决方案4】:

      关注link。这也很有帮助..

      在父窗口中:

      function OpenChildAsPopup() {
              var childWindow = window.open("ChildWindow.aspx", "_blank",
              "width=200px,height=350px,left=200,top=100");
              childWindow.focus();
       }
      
      function ChangeBackgroudColor() {
              var para = document.getElementById('samplePara');
              if (para !="undefied") {
                  para.style.backgroundColor = '#6CDBF5';
              }
       }
      

      父窗口 HTML 标记:

      <div>
        <p id="samplePara" style="width: 350px;">
                  Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
        </p><br />
       <asp:Button ID="Button1" Text="Open Child Window" 
               runat="server" OnClientClick="OpenChildAsPopup();"/>
      </div>
      

      在子窗口中:

      // This will be called when the child window is closed.     
        window.onunload = function (e) {
              opener.ChangeBackgroudColor();
              //or you can do
              //var para = opener.document.getElementById('samplePara');
              //if (para != "undefied") {
              //    para.style.backgroundColor = '#6CDBF5';
              //}
          };
      

      【讨论】:

        【解决方案5】:

        我知道这篇文章很旧,但我发现这确实很好用:

        window.onunload = function() {
            window.opener.location.href = window.opener.location.href;
        };
        

        window.onunload 部分是我在谷歌搜索此页面时发现的提示。谢谢,@jerjer!

        【讨论】:

          【解决方案6】:

          答案要求您将代码添加到生成的窗口中。那是不必要的耦合。

          // In parent window
          var pop = open(url);
          pop.onunload = function() {
            // Run your code, the popup window is unloading
            // Beware though, this will also fire if the user navigates to a different
            // page within thepopup. If you need to support that, you will have to play around
            // with pop.closed and setTimeouts
          }
          

          【讨论】:

            【解决方案7】:

            您可能想要使用“onbeforeunload”事件。它将允许您在子窗口关闭之前立即从子窗口调用父窗口中的函数。

            所以大概是这样的:

            window.onbeforeunload = function (e) {
                window.parent.functonToCallBeforeThisWindowCloses();
            };
            

            【讨论】:

            • 好吧,这看起来像我要找的东西,但它怎么知道我在说什么窗口。例如,如果我做 window.open() 然后我在下面添加它会知道它的那个窗口或者我如何将它附加到那个窗口?
            • 您将把 onbeforeunload 放在子窗口 HTML 中的脚本标记中。由于子窗口只有一个父窗口,因此浏览器会自动知道该父窗口是什么。
            • 所以如果我在父窗口中有一个名为 doSomething() 的函数,但它没有在子窗口中定义,它仍然允许我运行它吗?
            • 是的。你会做类似'window.parent.doSomething()'的事情。尽管您可能希望/必须使用 apply() JavaScript 函数 (javascriptkit.com/jsref/function.shtml) 来实际调用父函数。
            • 感谢您的帮助。你来对地方了,但我接受了另一个答案,因为它完全解决了我的问题。不过我会给你加一个
            猜你喜欢
            • 2012-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-07
            • 1970-01-01
            • 2019-10-06
            • 1970-01-01
            相关资源
            最近更新 更多