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