知识简说
window.open 命令在用户操作(trusted events)时, 才会正常的打开应该页面而不会被浏览器拦截
ps : 什么是 trusted events
trusted events is evnet.isTrusted is true. The isTrusted read-only property of the Event interface is a boolean that is true when the event was generated by a user action, and false when the event was created or modified by a script or dispatched via dispatchEvent.
阐述问题
很多时候,我们是需要在做异步请求回来时才能跳转,这时,如果等待到请求返回再去window.open 会被浏览器拦截。
解决方案
场景1,如果是在发送请求后等待请求回来,不管请求结果正确与否都要跳转页面的话
需要在发送请求前先var A = window.open() 一个新窗口。然后等请求结束了,在给这个窗口附上URL
function clickAction() {
var openWind = window.open()
ajaxAgent('POST', 'URL', params).then((resutl)=> {
opneWind.loaction.href = 'jumpURL'
})
}
- '注意' 这里会有个问题,如果异步请求的时间过长,会让用户感觉有个空白窗口在哪里晾着O__O …。
场景2,如果是想发送请求后等待请求回来,通过请求结果来决定是否要跳转,这时,就没发通过执行异步请求之前先打开个新窗口的方法来解决了,因为有可能会放回结构是失败,不希望跳转,这时,在去吧空窗口关闭,会给用户带来困惑。
目前就不能避免被拦截了,只能通知用户,让用户去给被拦截的页面新添加信任。
var openNewWindow = window.open(url);
// 判断跳转页面是否被拦截了。
// 如果已经拦截,就给他用户提示
// 提示的方式可以是引导用户去解决被拦截问题(添加信任)
if (!openNewWindow || openNewWindow.closed || typeof openNewWindow.closed === 'undefined') {
alert('您的支付界面窗口已经被浏览器拦截')
}