【问题标题】:Replace popup windows with iframes用 iframe 替换弹出窗口
【发布时间】:2014-06-17 18:10:37
【问题描述】:

我正在开发一个较新的 Web 应用程序,有时需要加载旧应用程序的一部分(通过 CGI)才能完成各种旧有操作。每当需要发生这种情况时,我只需将遗留文档填充到临时 iframe 中,直到用户完成所需的任何操作。 (顺便说一句,请记住,较新的应用不得允许弹出窗口、多个窗口/选项卡等)

但是,有时,iframe 的旧文档想要使用弹出窗口。因此,我设计了一种方法来使用包含另一个 iframe 的模式对话框来覆盖旧版的 window.open() 命令。这很好用....

但每当弹出窗口的基于表单的文档(现在已加载到模式对话框的 iframe 中) 尝试管理其状态时,我的问题就会出现。在初始加载时,它的表单会自动提交以获取最新的数据库数据……在 CGI 以新文档响应后,用户可以进行选择。选择后,表单再次提交给 CGI,CGI 以一个小的 JavaScript 响应,将其选择数据注入opener 窗口。

我的第一个问题是对opener 的引用,因为实际上不再存在(就遗留代码而言)。我通过将模态 iframe 的 contentWindow.opener 定义为我的旧文档的 iframe 窗口(我提到的第一个 iframe)解决了这个问题。

但是,当模态文档的表单提交时,状态丢失并且我的opener 定义被重置为null。因此,当用户在 modal 的 iframe 中进行选择时,旧代码无法通过 opener 引用返回任何值。

所以,我的问题很复杂,但基本上......
有没有办法保存 window.opener 引用,以便在该窗口更新时它不会丢失?我知道 JavaScript/DOM 是一种“通过引用传递”,但我担心我在这一点上过度设计了。

有什么想法吗?提示?
有人做过类似的事情吗?

【问题讨论】:

  • iframe 有一个 onload 事件。此时您是否尝试重新注入虚假的开启器对象?
  • @DarkFalcon,这正是我所希望的……有人帮我从树上看森林。我完全忽略了收听iframe 的可能性,而是专注于iframe.contentWindow... 快速控制台测试表明它可能有效〜或者至少帮助我更进一步。先生,我先谢谢你了。

标签: javascript forms dom iframe window


【解决方案1】:

这就是我所做的......
从本质上讲,我订阅了一个 onload 处理程序,该处理程序在该事件触发时设置 opener(每次提交表单时)。

myiframe.onload = function(){ 
    myiframe.contentWindow.opener = objWindow_mySavedOpenerReference;
    };

现在,每次状态更改时,iframe 都会处理重置 iframe 窗口中的打开器引用...使用该设置,任何依赖于 opener 引用的逻辑现在都可以工作。 --感谢@DarkFalcon 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多