关于window.open在不同浏览器的不同点
菜鸟教程: http://www.runoob.com/jsref/met-win-open.html
一、基本语法:
window.open(URL,name,specs,replace)
其中:
URL  为子窗口路径
name  为子窗口名字
specs 为窗口参数(各参数用逗号分隔)
二、返回值:
返回新创建的window对象。所以可以用返回的window调用方法。
第二个对象参数支持不同浏览器支持程度:
https://segmentfault.com/a/1190000016900915
几种打开新窗口的方式
- window.open()
- 创造 a 链接,手动触发 a.click()
- 创造 form 表单,手动触发 form.submit()(创造 form 表单,添加 button 子元素,手动触发button.click()情况相同,不做区分)
调用情形分组结果
使用 Chrome(70)、Firefox(63)、Edge、IE(9-11) 作为测试浏览器,对以下列举的打开新窗口的情形做测试。
x 表示被拦截,√ 表示新窗口正确打开
直接打开
即页面加载后直接调用打开新窗口代码
| 方式 | Chrome | Firefox | Edge | IE | 
|---|---|---|---|---|
| window.open() | x | x | x | x | 
| a.click() | x | x | x | x | 
| form.submit() | x | x | x | x | 
用户点击行为
- 按钮点击后直接打开 - 即在按钮被点击的回调中,直接调用打开新窗口的代码 - 方式 - Chrome - Firefox - Edge - IE - window.open() - √ - √ - √ - √ - a.click() - √ - √ - √ - √ - form.submit() - √ - √ - √ - √ 
- 按钮点击后延时打开 - 即在按钮被点击的回调中,通过 setTimeout 执行打开新窗口代码 - 方式 - Chrome - Firefox - Edge - IE - window.open() - √ - √ - × - × - a.click() - √ - √ - × - × - form.submit() - √ - √ - × - × 
- 按钮点击后在异步请求回调中打开 - 即在按钮被点击的回调中,发送请求,并在请求的回调中执行打开新窗口代码 - 方式 - Chrome - Firefox - Edge - IE - window.open() - x - x - x - x - a.click() - x - x - x - x - form.submit() - x - x - x - x 
用户键盘行为
我们以 input 元素进行测试(其他元素其他键盘事件也有相同效果),因为最可能使用的情况为 input 中使用回车打开新窗口。
- input keydown后直接打开 - 方式 - Chrome - Firefox - Edge - IE - window.open() - √ - x - √ - x - a.click() - √ - x - √ - x - form.submit() - √ - x - √ - x - 其中 ie9、ie10虽然会弹出拦截弹窗提示,但是能打开新窗口 
- 按钮点击后延时打开 - 方式 - Chrome - Firefox - Edge - IE - window.open() - √ - x - x - x - a.click() - √ - x - x - x - form.submit() - √ - x - x - x 
- 按钮点击后在异步请求回调中打开 - 方式 - Chrome - Firefox - Edge - IE - window.open() - x - x - x - x - a.click() - x - x - x - x - form.submit() - x - x - x - x 
规则总结
- 就参与测试的浏览器,三种打开新窗口的方式对拦截结果没有影响。
- 所有浏览器都不允许非用户操作引起的打开新窗口。
- 所有浏览器都不允许在异步 ajax 请求中打开新窗口。
- Edge 和 IE 不允许在 setTimeout 中打开新窗口,Chrome、Firefox 允许在用户操作事件中的 setTimeout 中打开新窗口。
- Firefox 和 IE 不允许在用户键盘操作事件中打开新窗口
解决方案
- 需要在异步 ajax 请求中打开新窗口的可以使用请求前打开新窗口,请求拿到结果后再修改窗口地址的方式。
- 需要在键盘回车事件中打开新窗口的推荐使用 form 表单包装并添加 button 的方式,回车触发默认的 submit 事件进行新窗口的打开。
function click_fun_new(){
    var tempwindow=window.open();//先打开临时窗体,由于是点击事件内触发,不会被拦截
    $.ajax({
        'url': '${pageContext.request.contextPath}/activity/savePrizes.htm',
        'type': 'post',
        'dataType': 'json',
        'data': data,
        success: function (data) {
            tempwindow.location = "www.baidu.com";//当回调的时候更改临时窗体的路径
        },
        error:function(){
            tempwindow.close();//回调发现无需打开窗体时可以关闭之前的临时窗体
        }
    });
---------------------
作者:Elong_Deo
来源:CSDN
原文:https://blog.csdn.net/qq525099302/article/details/51338879
版权声明:本文为博主原创文章,转载请附上博文链接!
关于window.open在不同浏览器的不同点的更多相关文章
- 异步调用window.open时被浏览器阻止新窗口解决方案
		var wyWindow = window.open('_blank');$http.post($rootScope.baseUrl + '/Interface0231A.ashx', { userF ... 
- 解决弹出的窗口window.open会被浏览器阻止的问题
		问题现象 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,有时候会一直连接,有时候会偶尔拦截, 尝试了很多方法,走了很多弯路,总结一下结果分享大家 原因分析&深入研究 1 ... 
- 解决弹出的窗口window.open会被浏览器阻止的问题(自定义open方法)
		由于在使用window.open时,在很多情况下,弹出的窗口会被浏览器阻止,但若是使用a链接target='_blank',则不会,基于这一特点,自己封装了一个open方法: function ope ... 
- window.frames在不同浏览器中的用法
		document.frames 等同于 window.frames,用来取得当前页面内 window 对象的集合. 不支持Firefox,其他浏览器(chrome.opera.IE.360)均支持. ... 
- window.close() 关闭当前浏览器页
		function eseFun() { var browserName = navigator.appName; //获取浏览器名称 if(browserName == "Netscape& ... 
- window.name应用于浏览器端数据存储
		本代码简单地分享利用window.name实现浏览器端数据存储: 1.在同一个页面一个地方设置window.name = "abc",另外一个地方读取window.name,自然能 ... 
- window.open方法被浏览器拦截的处理方式
		问题现象 当我们在一个 ajax 回调中执行 window.open 方法时,新页面会被浏览器拦截. 原因 在 Chrome 的安全机制里,非用户直接触发的 window.open 方法,是会被拦截的 ... 
- 关于event 和 window.event问题及浏览器兼容问题
		< html> < script language="javascript"> function test(event) { event = event | ... 
- 利用window.open如何绕过浏览器拦截机制
		在浏览器的安全机制里,非用户触发的window.open方法是会被拦截的,例如: var btn = $('#btn'); btn.click(function () { // 算做用户触发,所以不会 ... 
随机推荐
- code1085 数字游戏
			划分dp 把环变链(读入4 3 -1 2变成4 3 -1 2 4 3 -1 2) 设dp[i][j][k]为把i~j分成k份,各部分内的数字相加,相加所得的k个结果对10取模后再相乘,最终得到的一个数 ... 
- 冲刺NOIP2015提高组复赛模拟试题(五)1.数学作业
			1. 数学作业 [问题描述] 路人丙的数学老师非常乏力,他喜欢出一些非常乏力的数学题来为难乏力的学生们.这次数学老师布置了一堆的数学题作为作业,而且这些数学题有个共同的特点是都求C(N,M)中不同质因 ... 
- [Groovy]获取当前活动的Environment,获取response中节点的name和节点的value
			import com.eviware.soapui.support.GroovyUtils import com.eviware.soapui.support.XmlHolder import org ... 
- 去除json数据的某些键值对
			假如现在要处理的原始数据是字符串.形式如下: var vJson = { name: "张三", class: "软件工程一班" ,other:"无效 ... 
- Java中比较容易混淆的知识点
			1. equals() 和 == 运算符 - equals是方法, 而==是运算符(当然也可以说是广义上的方法, 或者最终都是调用方法). - equals() 是从Object类中继承来的, ... 
- [operator]jenkins+gitlab/Webhook自动构建发布
			开发同事在提交代码到gitlab后,需要使用jenkins对代码进行构建,每次都需要手动操作会很繁琐,如果工程很大,那么也会浪费时间,gitlab的webhook功能,可以在代码提交后自动调用jenk ... 
- 制作alipay-sdk-java包到本地仓库
			项目要用到支付宝的扫码支付,后台使用的maven 问了客服 官方目前没有 maven 的地址只能手动安装到本地了,如果建了maven 服务器也可以上传到服务器上 从支付宝官网上下载sdk 制作本地安装 ... 
- javascript总结30 :DOM事件
			事件: 1 在js中可以说一整套事件能完成一个功能: 事件的定义:当什么时候执行什么事: 使用事件的基本结构:事件源+事件类型=执行的指令 2 事件三要素:事件源 事件类型, 驱动程序(匿名函数). ... 
- .NET基础 (05)内存管理和垃圾回收
			内存管理和垃圾回收1 简述.NET中堆栈和堆的特点和差异2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存3 ... 
- unigui不是单个网页相应的链接,而是整体Web Application,如何把webApp的子功能映射到微信公众号菜单?
			只需要用UniApplication.Parameters.Values[‘xxx’]读取url的参数然后调用就可以 例如:要打开公众号菜单的取样送检指南查询模块,在自定义菜单设定:http://ww ... 
