解决弹出的窗口window.open会被浏览器阻止的问题
问题现象
最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,有时候会一直连接,有时候会偶尔拦截,
尝试了很多方法,走了很多弯路,总结一下结果分享大家
原因分析&深入研究
1 当浏览器检测到非用户操作产生的新弹出窗口,则会对其进行阻止。因为浏览器认为这不是用户希望看到的页面
2 在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的。
var btn = $('#btn');
btn.click(function () {
//不会被拦截
window.open('http://cssha.com')
});
如上 window.open是用户触发的时候,是不会被拦截的,可以正常打开新窗口
var btn = $('#btn');
btn.click(function () {
$.ajax({
url: 'ooxx',
success: function (url) {
//会被拦截
window.open(url);
}
})
});
如上 用户没有直接出发window.open,而是发出一个ajax请求,window.open方法被放在了ajax的回调函数里,这样的情况是会被拦截的
解决方案
先弹出一个页面,再进行ajax请求,这样就不会被拦截, 实例代码如下
var btn = $('#btn');
btn.click(function () {
//打开一个不被拦截的新窗口
var newWindow = window.open();
$.ajax({
url: 'ooxx',
success: function (url) {
//修改新窗口的url
newWindow.location.href = url;
}
})
});
继续进行优化
var btn = $('#btn');
btn.click(function () { //打开一个不被拦截的新窗口
var adPopup = window.open('about:blank', '_blank','width='+window.screen.width+',height='+window.screen.height+', ...');
$.ajax({
url: 'ooxx',
type:'post',
dataType:'json',
success: function (url) {
//修改新窗口的url
adPopup.blur();
adPopup.opener.focus();
adPopup.location = url; }
})
});
附带其他弹框方式
//a标签动态click
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();
}
//定时弹框 setTimeout('window.open(url);', 1);
参考文章
http://www.520ued.com/article/5417ef368d31c11e3b0003ff
http://zakwu.me/2015/03/03/dan-chu-chuang-kou-bei-liu-lan-qi-lan-jie-de-jie-jue-fang-an/
http://blog.csdn.net/starnight_cbj/article/details/5190283
解决弹出的窗口window.open会被浏览器阻止的问题的更多相关文章
- 解决弹出的窗口window.open会被浏览器阻止的问题(自定义open方法)
由于在使用window.open时,在很多情况下,弹出的窗口会被浏览器阻止,但若是使用a链接target='_blank',则不会,基于这一特点,自己封装了一个open方法: function ope ...
- WPF 解决弹出模态窗口关闭后,主窗口不在最前
本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口.使用另一个窗口在模态窗口前面.从任务栏打开模态窗口.关闭模态窗口.这时发现,主窗口会在刚才使用的另一个窗口下面 这是 Windows ...
- 2019-6-23-WPF-解决弹出模态窗口关闭后,主窗口不在最前
title author date CreateTime categories WPF 解决弹出模态窗口关闭后,主窗口不在最前 lindexi 2019-06-23 11:48:38 +0800 20 ...
- JS设置弹出小窗口。
经常上网的朋友可能会到过这样一些网站,一进入首页立刻会弹出一个窗口,或者按一个连接或按钮弹出,通常在这个窗口里会显示一些注意事项.版权信息.警告.欢迎光顾之类的话或者作者想要特别提示的信息.其实制作这 ...
- JS 弹出模态窗口解决方案
最近在项目中使用弹出模态窗口,功能要求: (1)模态窗口选择项目 (2)支持选择返回事件处理 在IE中有showModalDialog 方法,可以很好的解决该问题,但是在Chrome中和FF中就有问题 ...
- 创建一个弹出DIV窗口
创建一个弹出DIV窗口 摘自: http://www.cnblogs.com/TivonStone/archive/2012/03/20/2407919.html 创建一个弹出DIV窗口可能是现在 ...
- QUI操作超时弹出登录窗口登录的处理方式
在使用QUI开发的业务系统中,如果长时间没操作,session过期后,再次操作系统超时会自动跳转到登陆页面,如果当前有一些操作没有保存,需要重新登录后再次填写信息,用户体验很不好! 为了避免超时后页面 ...
- Windows下Java调用BAT批处理不弹出cmd窗口
常规Windows下Java调用BAT方式肯定会弹出cmd窗口 Runtime.getRuntime().exec("cmd.exe /C start D:\\test.bat") ...
- ***小程序wx.getUserInfo不能弹出授权窗口后的解决方案
微信更新api后,wx.getUserInfo在开发和体验版本都不能弹出授权窗口.微信文档说明: 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type=& ...
随机推荐
- EFUpdate
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- 关于 printf() 函数的三张表格
函数原型: printf(Control-String, item1, item2, ...); 表一 转换说明符及作为结果的打印输出 转 换 说 明 输 出 %a 浮点数.十六进制数字和p- ...
- monkey之三:monkey测试测略(摘抄)
一.分类 Monkey测试针对不同的对象,不同的目的,采用不同的测略方案. 测试类型分为: 应用程序的稳定性测试和压力测试 测试对象分为: 单个APK和多个APK集合 测试目的分为: 解决问题的测试( ...
- Thread比Task多出的无法代替的部分
Task比Thread耗资源更少,且默认在线程池中. 但是Thread能够设置为STA来执行而Task不能,这对于某些特殊功能很重要,比如WebBrowser控件对象就不能在非单线程单元的线程中new ...
- 发布报错:Error ITMS-90635 - Invalid Mach-O in bundle - submitting to App store
发布报错:Error ITMS-90635 - Invalid Mach-O in bundle - submitting to App store 昨晚上传项目到AppStore,报了这个错,纳尼! ...
- 常用的HTML代码
一.文字1.标题文字 <h#>..........</h#> #=1~6:h1为最大字,h6为最小字 2.字体变化 <font>..........</fon ...
- 实现滑动可固定header以及页面刷新
用到的布局:SwiperRefreshLayout,AppBarLayout,ToolBar,CollapsingToolbarLayout,CoordinatorLayout 布局 <?xml ...
- CentOS 7.2安装docker-compose运行gitlib
服务器已经安装好docker 启动: service start docker 安装docker-compose: 安装pip:sudo yum search pip / sudo yum inst ...
- VirtualBox上搭建Ubuntu开发环境
软件版本: VirtualBox虚拟机:5.1.8 for Windows hosts x86/amd64 Ubuntu系统:Ubuntu 14.04.5 LTS Desktop (32-bit) ...
- Android-Menu [使用C# And Java实现]
本篇是对安卓菜单使用编程方式实现,当然可以使用XML的方式完成同样的功能,基本Java和C#写法都是一致的,所以使用XML的方式在本篇中使用Java演示,需要注意的是,对于如果不是VS开发的话,那么资 ...