浏览器拦截js打开新窗口的解决方案

今天技术大佬问了我一个问题:使用js在浏览器中打开新的窗口,什么时候会被拦截?什么时候不会被拦截?

一下给我问住了·······

于是上网百度的一波~


常用的两种打开新窗口的方式

  1. window.open()
  2. 用a标签的target="_blank"
    在模板中插入一个a标签,然后javascript去触发a链接的click,实现跳转。(该方法在jQuery跟js中有坑...)
//***jQuery***
<a href="http://wuliv.com" id="openNew"></a>
$(function(){
  $('#openNew').click()
})
//失败无效

//***jQuery***
<a href="http://wuliv.com" id="openNew">
  <span><span>
</a>
$(function(){
  $('#openNew span').click()
})
//成功打开新页面

//***javascript***
<a href="http://wuliv.com" id="openNew"></a>
document.getElementById('openNew').click()
//成功打开新页面

使用jquery来触发a标签点击跳转时,需在a标签插入一个子标签,然后触发子标签的点击实现a标签的跳转(有点绕)

$("#openNew")得到的是一个jquery的对象,jquery本身对该对象的一些属性进行了封装,所以会导致click失效;而使用js对象 document.getElementById("a") 则不会存在该问题

onclick()也可以触发事件,但是onclick跟click不同;
onclick触发的是方法,而click先触发按钮的点击事件,再触发方法。
如果该对象没有绑定onclick方法则无法被触发,而click没有绑定方法也可以触发。


弹出新窗口失败的原因:

  1. 使用window.open(),但是定义了窗口名,也就是在打开窗口传入name参数,因为window.open只能打开唯一的窗口名为name的窗口页面,如果同名,则无法打开。
    解决方案:window.open()不定义窗口名

  2. 使用了异步请求,通过ajax向服务器请求数据,在请求完成后再打开新窗口。因为异步请求存在延时,浏览器会认为不是用户触发的操作。
    解决方案:
    2.1 ajax请求设置成同步的方式
    如果使用了jQuery中的ajax方法做异步请求,则可以配置 async: false, 使请求方式变为同步。
    2.2 vue2.0采用的axios进行数据请求,axios没有同步请求的设置,都是异步的。
    在axios请求之前先打开一个空白的新窗口
    var newPage = window.open()打开的空白页上有标题,显示的是“无标题”
    window.open('about:blank') 标题上显示的是'about:blank'
    接着在axios的then回调里写入要打开的url
    newPage.location.href = 'url'

至此解决了浏览器阻止新窗口弹窗问题。
一个小问题,有这么多道道,外面世界太浮躁,还是安心写代码来的舒畅些。



原著:以乐之名
链接:https://www.jianshu.com/p/82a80e4e110c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值