如何让表单提交时始终打开新窗口而非覆盖已有窗口?
解决表单提交时强制打开新窗口而非覆盖已有窗口的问题
问题出在你给window.open和表单target指定了固定的窗口名称templet——浏览器会复用同名的窗口,所以每次提交都会覆盖之前打开的窗口。要实现每次打开新窗口,核心是每次使用唯一的窗口名称,让浏览器识别为新的窗口请求。
下面是具体的修改方案:
方案1:动态生成唯一窗口名称(推荐,可控性强)
我们可以在表单提交时,生成一个随机/唯一的窗口名称(比如用时间戳+随机数组合),同时把表单的target设置为这个名称,这样每次提交都会触发新窗口的打开。
修改步骤:
- 替换表单固定的
onsubmit事件为动态生成窗口名称的函数 - 修正你现有脚本里的路径错误(原代码中
'. / test2.html '的空格会导致路径无效) - 确保表单的
target和新生成的窗口名称完全一致
修改后的完整代码:
HTML部分:
<form id="form1" name="templet" onsubmit="openNewWindow()" action="/" method="post"> <select name="gotemplet" id="gotemplet" size="1" onChange="javascript:chgAction()" required> <option value="">Select an option</option> <option data-action="./test2.html" value="down">Service Down</option> <option data-action="./test1.html" value="mail">Mail</option> </select> <input type="submit" value="create template"> </form>
JavaScript部分:
// 生成唯一窗口名称并打开新窗口的函数 function openNewWindow() { // 用时间戳+随机数生成唯一名称,彻底避免重复 const uniqueWindowName = `templet_${Date.now()}_${Math.floor(Math.random() * 1000)}`; // 打开配置好的新窗口 window.open('', uniqueWindowName, 'width=900,height=1000,scrollbars=yes'); // 将表单的target设置为这个唯一名称,确保提交内容指向新窗口 document.getElementById('form1').target = uniqueWindowName; } // 修正后的表单action切换脚本 (function() { var form = document.querySelector('#form1'), select = form.querySelector('#gotemplet'), action = { 'down': './test2.html', // 对应select选项的value="down" 'mail': './test1.html' // 对应select选项的value="mail" }; select.addEventListener('change', function() { var el = this, value = el.value; if (action[value]) { form.action = action[value]; } }, false); }());
方案2:不指定窗口名称(简化版)
如果你不需要控制窗口名称,也可以直接去掉window.open的第二个参数(窗口名称),浏览器会自动为每次打开请求生成新窗口。不过这种方式需要确保表单没有固定的target值:
<form id="form1" name="templet" onsubmit="window.open('', '', 'width=900,height=1000,scrollbars=yes'); return true;" action="/" method="post"> <!-- 其余HTML内容保持不变 --> </form>
注意事项
部分浏览器的弹窗拦截机制可能会阻止自动打开的窗口,不过你的场景是用户主动点击提交按钮触发的,属于合法的用户交互,一般不会被拦截。
内容的提问来源于stack exchange,提问作者Stefan M.
相关产品推荐
相关产品推荐

