我的问题的症结在于:如何确定通过表单提交启动的窗口是否实际启动?
我继承了一个凌乱的旧网站,该网站在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。
谁能看到一种无需打开另一个窗口就能判断窗口是否打开的方法?如果表单提交事件未打开它,我可以对其进行引用。
答案 0 :(得分:2)
我怀疑您可以根据自己的情况调整this technique。
但是,如果没有,我会想到另一种方法:
submit
处理程序中,让JavaScript代码根据表单提交主动打开窗口,并禁用表单提交。opener
来说出它何时加载。HTMLFormElement#submit
方法来执行此操作,它将不会触发submit
处理程序;某些工具,例如jQuery 将会,因此请注意)。
opener
,以告知响应已到达(因此opener
重新启用该按钮)。还要在执行相同操作的“正在加载”页面中放置一个超时(并显示超时错误)。