菜鸟教程: 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

几种打开新窗口的方式

  1. window.open()
  2. 创造 a 链接,手动触发 a.click()
  3. 创造 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

用户点击行为

  1. 按钮点击后直接打开

    即在按钮被点击的回调中,直接调用打开新窗口的代码

    方式 Chrome Firefox Edge IE
    window.open() √ √ √ √
    a.click() √ √ √ √
    form.submit() √ √ √ √
  2. 按钮点击后延时打开

    即在按钮被点击的回调中,通过 setTimeout 执行打开新窗口代码

    方式 Chrome Firefox Edge IE
    window.open() √ √ × ×
    a.click() √ √ × ×
    form.submit() √ √ × ×
  3. 按钮点击后在异步请求回调中打开

    即在按钮被点击的回调中,发送请求,并在请求的回调中执行打开新窗口代码

    方式 Chrome Firefox Edge IE
    window.open() x x x x
    a.click() x x x x
    form.submit() x x x x

用户键盘行为

我们以 input 元素进行测试(其他元素其他键盘事件也有相同效果),因为最可能使用的情况为 input 中使用回车打开新窗口。

  1. input keydown后直接打开

    方式 Chrome Firefox Edge IE
    window.open() √ x √ x
    a.click() √ x √ x
    form.submit() √ x √ x

    其中 ie9、ie10虽然会弹出拦截弹窗提示,但是能打开新窗口

  2. 按钮点击后延时打开

    方式 Chrome Firefox Edge IE
    window.open() √ x x x
    a.click() √ x x x
    form.submit() √ x x x
  3. 按钮点击后在异步请求回调中打开

    方式 Chrome Firefox Edge IE
    window.open() x x x x
    a.click() x x x x
    form.submit() x x x x

规则总结

  1. 就参与测试的浏览器,三种打开新窗口的方式对拦截结果没有影响。
  2. 所有浏览器都不允许非用户操作引起的打开新窗口。
  3. 所有浏览器都不允许在异步 ajax 请求中打开新窗口。
  4. Edge 和 IE 不允许在 setTimeout 中打开新窗口,Chrome、Firefox 允许在用户操作事件中的 setTimeout 中打开新窗口。
  5. Firefox 和 IE 不允许在用户键盘操作事件中打开新窗口

解决方案

  1. 需要在异步 ajax 请求中打开新窗口的可以使用请求前打开新窗口,请求拿到结果后再修改窗口地址的方式。
  2. 需要在键盘回车事件中打开新窗口的推荐使用 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在不同浏览器的不同点的更多相关文章

  1. 异步调用window.open时被浏览器阻止新窗口解决方案

    var wyWindow = window.open('_blank');$http.post($rootScope.baseUrl + '/Interface0231A.ashx', { userF ...

  2. 解决弹出的窗口window.open会被浏览器阻止的问题

    问题现象 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,有时候会一直连接,有时候会偶尔拦截, 尝试了很多方法,走了很多弯路,总结一下结果分享大家 原因分析&深入研究 1 ...

  3. 解决弹出的窗口window.open会被浏览器阻止的问题(自定义open方法)

    由于在使用window.open时,在很多情况下,弹出的窗口会被浏览器阻止,但若是使用a链接target='_blank',则不会,基于这一特点,自己封装了一个open方法: function ope ...

  4. window.frames在不同浏览器中的用法

    document.frames 等同于 window.frames,用来取得当前页面内 window 对象的集合. 不支持Firefox,其他浏览器(chrome.opera.IE.360)均支持. ...

  5. window.close() 关闭当前浏览器页

    function eseFun() { var browserName = navigator.appName; //获取浏览器名称 if(browserName == "Netscape& ...

  6. window.name应用于浏览器端数据存储

    本代码简单地分享利用window.name实现浏览器端数据存储: 1.在同一个页面一个地方设置window.name = "abc",另外一个地方读取window.name,自然能 ...

  7. window.open方法被浏览器拦截的处理方式

    问题现象 当我们在一个 ajax 回调中执行 window.open 方法时,新页面会被浏览器拦截. 原因 在 Chrome 的安全机制里,非用户直接触发的 window.open 方法,是会被拦截的 ...

  8. 关于event 和 window.event问题及浏览器兼容问题

    < html> < script language="javascript"> function test(event) { event = event | ...

  9. 利用window.open如何绕过浏览器拦截机制

    在浏览器的安全机制里,非用户触发的window.open方法是会被拦截的,例如: var btn = $('#btn'); btn.click(function () { // 算做用户触发,所以不会 ...

随机推荐

  1. 魔法变量*args 和 **kwargs

    其实并不是必须写成*args 和**kwargs. 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定. *ar ...

  2. Metadata Service 最高频的应用 - 每天5分钟玩转 OpenStack(164)

    实现 instance 定制化,cloud-init(或 cloudbase-init)只是故事的一半,metadata service 则是故事的的另一半.两者的分工是:metadata servi ...

  3. Java TreeMap的排序

    TreeMap 和 HashMap 用法大致相同,但实际需求中,我们需要把一些数据进行排序:以前在项目中,从数据库查询出来的数据放在List中,顺序都还是对的,但放在HashMap中,顺序就完全乱了. ...

  4. [SoapUI] SOAP UI-Groovy Useful Commands

    Hi All, I have posted the SOAPUI and Groovy useful commands that may help you in your testing. Below ...

  5. jekyll Mac上各种安装问题总结

    Mac上自带了ruby,版本信息如下: qiyongdeMacBook-Air:webproxy qiyong$ ruby -v ruby 2.0.0p481 (2014-05-08 revision ...

  6. charles4.2下载与破解方法以及配置https.RP

    Charles下载地址 地址:https://www.charlesproxy.com/latest-release/download.do 2. Charles破解 破解地址:https://www ...

  7. Python实现二叉树的遍历

    二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子树和右子树的二叉树组成. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉 ...

  8. 39 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

    题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class _039PrintFu ...

  9. 将std::string当字节流使

    string是C++标准定义的字符串类,它不但支持文本,而且支持二进制字节流.给一个string变量赋值有多种方法: 1) 拷贝构造函数 2) 等号赋值函数 3) append成员函数 4) push ...

  10. Appium常用Api实操

    本文是基于python语言在android上实操的,仅记录(忽略排版~~~) 会不时更新的: from appium import webdriver from selenium.webdriver. ...