admin 管理员组文章数量: 887019
最近遇到一个需求,前端传给后端用户信息,经过后端加密后,返回前端一个URL地址,要求前端拿到请求回来的URL地址,并跳转到URL所指向的页面。在坑里爬了很久,总结出是三种解决方案,供碰到相似问题的小伙伴参考。
分析:大部分现代的浏览器(泛指 Chrome / Firefox / IE 10+ / Safari)都默认开启了阻止弹出窗口的策略,原因是 window.open 被广告商滥用,严重影响用户的使用。这个阻止弹出窗口的操作,并不是直接封杀 windw.open(),而是会根据用户的行为来判断这次 window.open() 是否属于流氓操作。
一、将ajax请求设置为同步请求
$.ajax({
method: "get",
url: "http://www.baidu?id=1",
async: false, //设置为同步请求
data: data,
success: function(){
window.open("http://www.baidu", "_blank");
}
})
二、新开页面并重定向
这种方法有一个不好的地方就是,会先新开一个空白页,然后重定向到我们需要的页面。如果网速不够快,应该能很容易让用户发觉这个重定向的过程。
let newWin = window.open("about:blank");
$.ajax({
method: "get",
url: "http://www.baidu?id=1",
data: data,
success: function(){
newWin.location.href="http://www.baidu"
},
error: function(){
newWin.close();//回调发现无需打开窗体时可以关闭之前的临时窗体
}
})
三、 延迟这个打开URL(等到ajax拿到URL后再打开URL)
setTimeout('window.open(url);', 500); // 有风险,延迟时间不能太短 否则也会被拦截
// 去支付
toPay(shopItem) {
var newTab = window.open('about:blank');
toPayLink({ tradeShopOrderNum: shopItem.tradeShopOrderNum }).then(res => {
let url = res.data
newTab.location.href = url;
// 打开模态框
setTimeout(() => {
this.$confirm('是否已完成支付?', '提示', {
confirmButtonText: '已完成',
cancelButtonText: '未完成',
type: 'warning',
showClose: false,
closeOnClickModal: false
}).then(() => {
this.$emit('orderCancel')
}).catch(() => {
this.$emit('orderCancel')
});
}, 1000)
}).catch(res => {
newTab.close();
this.$confirm('只有待支付的订单可以支付!', '警告', {
confirmButtonText: '确定',
type: 'warning',
showClose: false,
showCancelButton: false,
closeOnClickModal: false
}).then(() => {
this.$emit('orderCancel')
})
})
},
版权声明:本文标题:Ajax请求URL地址,并在ajax请求中打开这个地址,被浏览器禁止问题解决办法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726856267h1040389.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论