首页 > 解决方案 > 按名称查找通过 POST 打开的子窗口

问题描述

我的问题的症结在于:如何判断通过表单提交启动的窗口是否实际启动?

我继承了一个在 Apache 服务器上使用 CGI 和 Perl 的凌乱的旧网站。它是几十年前编写的,即使对于 Perl,代码也非常糟糕,所以我想避免更改太多,因为我们有数百个客户使用的数百个报告。
最初的问题是,当按下“确定”按钮时,有时似乎什么也没发生,因为该过程需要很长时间,因此用户会继续单击它。这将在运行 Apache 的 Unix 机器上产生许多新进程并导致问题。“程序员”设计网站的方式是,他在表单标签的目标属性中放置了一个名称。这通常会打开一个具有该名称的新窗口(最终)。

<form name="PARAMETERS"
  method="POST"
  action="reportsrv.cgi"
  onsubmit="watchChild('_REPORT1556723905', 'reportSubmit3', true);"
  target="_REPORT1556723905">

另一位程序员试图通过使用 java 脚本禁用 OK 按钮,然后让新打开的窗口找到其父窗口,然后启用该按钮来解决此问题。当在我们的托管环境中,有时新窗口根本没有打开时,这不起作用。因此,我们的客户认为某些事情正在发生,但实际上并没有发生(因为窗口没有打开,并且启用按钮的 javascript 从未运行过)。
我编写了一个简单的函数,它使用 setTimer 来查找窗口并查看它是否打开,但找到它的唯一方法是使用 window.open() 函数。

function watchChild(targetName, thebuttonname, disable) {
setTimeout( function()
{
    var child = window.open("", targetName); // opens new window if not found!
    if (!child) {
        child = window.frames[targetName];
    }
    var child = window.frames[targetName];
    if (child) {
        alert('child found');
        if (disable) {
            //disableButton(thebuttonname, disable);
        }
        watchChild(targetName, thebuttonname, false);
        return;
    }
    // frames are empty
    alert('child not found: ' + targetName + '; frame count = ' + window.frames.length);
    //disableButton(thebuttonname, false);
}, 3000 );

现在我的问题是,如果 window.open("", Name) 找到窗口(如果存在)的唯一可靠方法,但如果窗口不存在则打开一个空白窗口。
子窗口的逻辑是在进程完成之前不会渲染任何内容(这可能需要很长时间),所以在那之前我不能向它添加 javascript。
谁能在不打开另一个窗口的情况下判断窗口是否打开?如果表单提交事件没有打开它,我可以保留对它的引用。

标签: javascripthtml

解决方案


我怀疑你可以根据你的情况调整这种技术

但是,如果没有,我会想到另一种方法:

  • 不要禁用提交按钮(或只是暂时禁用)。
  • submit处理程序中,让 JavaScript 代码主动打开窗口以响应表单提交,并禁用表单提交。
  • 让 JavaScript 代码加载的页面显示进程正在运行。
  • 让该页面回调它opener以说明它何时加载。
  • 通过以编程方式提交表单来响应这一点(如果您使用 DOM 自己的HTMLFormElement#submit方法执行此操作,它不会触发submit处理程序;一些工具(如 jQuery ),因此请注意这一点)。
    • 这将使表单以已经打开的窗口为目标。
  • 如果您希望在报告的整个过程中禁用该按钮,请让响应页面中的代码伸出手来opener告诉它响应已到达(因此opener重新启用该按钮)。还要在执行相同操作的“加载”页面中设置超时(并显示超时错误)。

推荐阅读