Firefox表单提交至新窗口异常:打开双窗口问题求助
Firefox中表单提交触发双窗口的解决方案
你的代码在Chrome、IE等浏览器中能正常将表单提交到指定弹窗,但Firefox会先打开一个about:blank空白窗口,提交后再新建标签页,核心原因是Firefox对window.open('#', '窗口名')的解析逻辑和其他浏览器不同——它会把#识别为当前页面的锚点链接,导致表单提交时无法正确关联已打开的窗口,从而触发新窗口。
修正后的代码
首先修正表单引用的笔误(你的表单name是TestName,原JS里的document.myform无法正确定位表单),再调整window.open的URL参数:
JavaScript代码
// 正确获取目标表单 const form = document.TestName; form.aValue.value = 1; form.bValue.value = 2; form.cValue.value = '3'; form.target = 'myTestWindowID'; // 用about:blank代替#,让Firefox识别为空白独立窗口 const popup = window.open('about:blank', 'myTestWindowID', 'width=600,height=600,resizable=yes,scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no'); // 处理弹窗被拦截的情况 if (popup) { form.submit(); } else { alert('弹窗被浏览器拦截,请允许弹窗后重试'); } return false;
表单代码(无需修改,仅确认结构)
<form name="TestName" class="smallform" action="myActionUrl.php" method="post" target="myTestWindowID" rel="noopener" style="display: none"> <input type="hidden" name="aValue" value=""> <input type="hidden" name="bValue"> <input type="hidden" name="cValue"> </form>
额外优化:复用已存在的窗口
如果用户之前已经打开过myTestWindowID窗口,可以直接复用,避免重复创建:
const form = document.TestName; form.aValue.value = 1; form.bValue.value = 2; form.cValue.value = '3'; form.target = 'myTestWindowID'; // 先尝试获取已存在的窗口 let popup = window.open('', 'myTestWindowID'); // 窗口不存在则新建 if (!popup) { popup = window.open('about:blank', 'myTestWindowID', 'width=600,height=600,resizable=yes,scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no'); } if (popup) { popup.focus(); // 激活窗口 form.submit(); } else { alert('弹窗被浏览器拦截,请允许弹窗后重试'); } return false;
内容的提问来源于stack exchange,提问作者Florianb
相关产品推荐
相关产品推荐

