在打开一个新窗口时,因为浏览器的安全机制,用户未始终容许的状况下,可能会触发到浏览器拦截,没法正常直接弹出。git
网上有不少给出解决方案的只言片语,不够全面,因此针对本身遇到的问题作了详细的状况分析。总结成文,避免之后混淆。github
只分析使用 js 代码手动打开新窗口的方式。ajax
测试代码用例在此浏览器
window.open()
a.click()
form.submit()
(创造 form 表单,添加 button 子元素,手动触发 button.click()
状况相同,不作区分)使用 Chrome(70)、Firefox(63)、Edge、IE(9-11) 做为测试浏览器,对如下列举的打开新窗口的情形作测试。安全
x 表示被拦截,√ 表示新窗口正确打开异步
即页面加载后直接调用打开新窗口代码post
方式 | Chrome | Firefox | Edge | IE |
---|---|---|---|---|
window.open() | x | x | x | x |
a.click() | x | x | x | x |
form.submit() | x | x | x | x |
按钮点击后直接打开测试
即在按钮被点击的回调中,直接调用打开新窗口的代码code
方式 | Chrome | Firefox | Edge | IE |
---|---|---|---|---|
window.open() | √ | √ | √ | √ |
a.click() | √ | √ | √ | √ |
form.submit() | √ | √ | √ | √ |
按钮点击后延时打开orm
即在按钮被点击的回调中,经过 setTimeout 执行打开新窗口代码
方式 | Chrome | Firefox | Edge | IE |
---|---|---|---|---|
window.open() | √ | √ | × | × |
a.click() | √ | √ | × | × |
form.submit() | √ | √ | × | × |
按钮点击后在异步请求回调中打开
即在按钮被点击的回调中,发送请求,并在请求的回调中执行打开新窗口代码
方式 | Chrome | Firefox | Edge | IE |
---|---|---|---|---|
window.open() | x | x | x | x |
a.click() | x | x | x | x |
form.submit() | x | x | x | x |
咱们以 input 元素进行测试(其余元素其余键盘事件也有相同效果),由于最可能使用的状况为 input 中使用回车打开新窗口。
input keydown后直接打开
方式 | Chrome | Firefox | Edge | IE |
---|---|---|---|---|
window.open() | √ | x | √ | x |
a.click() | √ | x | √ | x |
form.submit() | √ | x | √ | x |
其中 ie九、ie10虽然会弹出拦截弹窗提示,可是能打开新窗口
按钮点击后延时打开
方式 | Chrome | Firefox | Edge | IE |
---|---|---|---|---|
window.open() | √ | x | x | x |
a.click() | √ | x | x | x |
form.submit() | √ | x | x | x |
按钮点击后在异步请求回调中打开
方式 | Chrome | Firefox | Edge | IE |
---|---|---|---|---|
window.open() | x | x | x | x |
a.click() | x | x | x | x |
form.submit() | x | x | x | x |