如何在window.open()中使用close()?自动关闭窗口失效求助
解决自动关闭新窗口失效的问题
问题原因
- 跨域限制:当通过
window.open打开第三方域名(如google.com)的页面后,浏览器同源策略会禁止原页面脚本访问该窗口的close()方法。两个页面域名、协议或端口不一致时,原页面无法操控跨域窗口的关闭逻辑,导致超时回调中的win.close()执行失败。 - 次要问题:
welcome并非异步函数,但asyncCall中使用了await,这会导致await无意义,但不是窗口无法关闭的直接原因。
解决方案
针对第三方页面的调整方案
由于无法修改第三方页面代码,可调整原页面打开窗口的逻辑:
function welcome(){ let msg = confirm("Access Membership?"); if (msg == true) { // 先打开同源空白窗口 var win = window.open('', '_blank', ''); // 跳转至目标页面 win.location.href = 'http://www.google.com'; setTimeout(function () { try { win.close(); } catch (e) { console.error("关闭窗口失败:", e); } }, 2000); } } async function asyncCall(){ const phone = await getPhone(); welcome(); // 无需await,welcome不是异步函数 }
⚠️ 注意:部分浏览器可能将这种“打开空白页立即跳转”的行为判定为广告弹窗,进而拦截窗口或禁止关闭操作。
自有页面的最优方案
如果目标页面属于你的网站,直接在目标页面中添加自动关闭逻辑即可避开跨域限制:
在目标页面的脚本中加入:
window.addEventListener('load', () => { setTimeout(() => { window.close(); }, 2000); });
内容的提问来源于stack exchange,提问作者icetoice
相关产品推荐
相关产品推荐

