首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >window.open打开页面会被浏览器拦截问题解决

window.open打开页面会被浏览器拦截问题解决

作者头像
celineWong7
发布2020-11-05 15:33:03
发布2020-11-05 15:33:03
11.4K0
举报
文章被收录于专栏:web前端踩坑web前端踩坑

window.open是javascript函数,该函数的作用是打开一个新窗口或改变原窗口,如果你直接在js中调用window.open()去打开一个新窗口,浏览器会拦截。 (注意:window.open(url,'_self')在原窗口打开,不会被拦截)。

普通情况下window.open不会拦截,但若是在ajax的回调里面进行window.open,会拦截!因为浏览器会认为这是一个骚扰用户的行为。 在网上找到一些解决方案,总结如下。其中只有方案1、方案2个人验证过有效。其他未知orz...

方案1: 先window.open('_blank'),再赋值location跳转链接
代码语言:javascript
复制
// 先打开新页签
var  tempWin  = window.open("_blank"); // window.open("about:blank"); 
$.ajax({
            type: "post",
            url: xxx,
            data: data,
            contentType: "application/json;charset=UTF-8",
            success: function (response) {
                   //给新页签设置跳转链接
                  tempWin.kk = "www.baidu.com";  
            }
        });

这种情况有个缺陷:

  1. 若你的新页面需要从sessionStorage取值,那这种方式是取不到的。 解决方法:采用url传参方式。比如tempWin.kk = "www.baidu.com?id=xxxx";. 然后通过以下 getParam方法获取url参数:
代码语言:javascript
复制
function getParam(a) {
            var b = new RegExp("(^|&)" + a + "=([^&]*)(&|$)");
            var r = window.location.search.substr(1).match(b);
            if (r != null) return unescape(r[2]);
            return ""
        }
  1. 若你在ajax请求成功后还有业务判断,判断后决定是否要跳转。这时候预先打开一个空页签就很鸡肋。 解决方法:参考网上方案,只能采用方案2
方案2:设置ajax请求为async:false——同步模式。
代码语言:javascript
复制
$.ajax({
        type: "post",
        url: "/xxxx/xxxx",
        async: false,// 设置同步(默认异步)
        data: data,
        contentType: "application/json;charset=UTF-8",
        success: function (data) {
            if(xxx){
                window.open(url);
            }
        }
    });

异步当然有异步的好处,全部同步那就呵呵哒了,所以局部使用吧。

(接下来的方案,各自看看试试,不保证管用,只是搜集来mark下)

方案3:采用a标签
代码语言:javascript
复制
 <a href="" target="_blank">click me</a>

 # 点击这个超链接,浏览器会认为它是打开一个新的链接,就不会拦截。
 <a href="javascript:void(0)" onclick="window.open()"></a>

缺陷:有时候需要点击时候,进行一些其他设置或操作,再跳转。所以需要在js中完成。

方案4:笨笨的setTimeout

使用 setTimeout 包装一下,也可以防止被浏览器拦截。注意这里的超时时间不能太短,否则也会被拦截。

代码语言:javascript
复制
 setTimeout('window.open(url);', 500);
方案5:创建form标签,js代码进行提交

创建一个form新元素,并赋予响应属性,然后手动代码进行submit(); 注意:若需传递参数?id=1类似这种,需要指定POST方法。默认是GET方法,无法传递参数。

代码语言:javascript
复制
var form = document.createElement('form');
form.action = 'www.baidu.com?id=1';
form.target = '_blank';
form.method = 'POST';

document.body.appendChild(form);
form.submit();
方案6:巧用a标签的特性:创建一个a标签,手动代码进行click触发。
代码语言:javascript
复制
function newWin(url, id) {
      var a = document.createElement('a');
      a.setAttribute('href', url);
      a.setAttribute('target', '_blank');
      a.setAttribute('id', id);
      // 防止反复添加
      if(!document.getElementById(id)) {         
        document.body.appendChild(a);
      }
      a.click();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方案1: 先window.open('_blank'),再赋值location跳转链接
  • 方案2:设置ajax请求为async:false——同步模式。
  • 方案3:采用a标签
  • 方案4:笨笨的setTimeout
  • 方案5:创建form标签,js代码进行提交
  • 方案6:巧用a标签的特性:创建一个a标签,手动代码进行click触发。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档