javascript - 按名称查找通过 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。
谁能在不打开另一个窗口的情况下判断窗口是否打开?如果表单提交事件没有打开它,我可以保留对它的引用。
解决方案
我怀疑你可以根据你的情况调整这种技术。
但是,如果没有,我会想到另一种方法:
- 不要禁用提交按钮(或只是暂时禁用)。
- 在
submit
处理程序中,让 JavaScript 代码主动打开窗口以响应表单提交,并禁用表单提交。 - 让 JavaScript 代码加载的页面显示进程正在运行。
- 让该页面回调它
opener
以说明它何时加载。 - 通过以编程方式提交表单来响应这一点(如果您使用 DOM 自己的
HTMLFormElement#submit
方法执行此操作,它不会触发submit
处理程序;一些工具(如 jQuery )会,因此请注意这一点)。- 这将使表单以已经打开的窗口为目标。
- 如果您希望在报告的整个过程中禁用该按钮,请让响应页面中的代码伸出手来
opener
告诉它响应已到达(因此opener
重新启用该按钮)。还要在执行相同操作的“加载”页面中设置超时(并显示超时错误)。
推荐阅读
- java - Spring Boot / Thymeleaf - 循环内循环
- apache2 - PassEnv 之后的条件 SetEnv
- python - Python:使用循环,读取数据并将其保存到不同的列表
- javascript - 从 textarea 中删除带有换行符的方大括号内的内容
- python - 如何将值列表映射到分类向量
- c# - 由其他 UserControl 的 ElementName 触发
- javascript - 如何从 controlBar 组件中删除两个自定义按钮
- android - Firebase 未向移动设备发送身份验证代码以进行移动验证
- sql-server - SSRS 中的空单元格给出随机值
- javascript - 你能在 Kendo UI 中制作一个包含多个字段的过滤器吗?