根据通过POST

时间:2019-05-01 15:47:18

标签: javascript html

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

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

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

另一位程序员试图通过使用Java脚本禁用“确定”按钮来解决此问题,然后让新打开的窗口找到其父窗口,然后启用该按钮。在我们的托管环境中,有时有时只是无法打开新窗口,因此无法使用。因此,我们的客户认为,如果没有,则发生了某些事情(因为窗口没有打开,并且启用按钮的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。
谁能看到一种无需打开另一个窗口就能判断窗口是否打开的方法?如果表单提交事件未打开它,我可以对其进行引用。

1 个答案:

答案 0 :(得分:2)

我怀疑您可以根据自己的情况调整this technique

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

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