浏览器阻止新窗口(window.open或新窗的form提交)

在写js时,经常会出现浏览器会阻止用js写的window.open代码,但是,又不是每次都会阻止,它只会阻止特定情况下的window.open。

因为如果浏览器默认都阻止window.open代码是不现实的,所以观察chrome浏览器对window.open阻止情况的总结如下:

浏览器不会阻止用户主动发起的window.open方法;浏览器一般都会阻止非用户主动发起的window.open。

这里有一个问题,什么叫用户主动发起?

如下代码在执行过程中就是用户主动发起

<a href="window.open(‘http://www.baidu.com‘,‘_blank‘);">百度</a>

如下代码在执行过程中会被认为非用户主动发起:

<a href="javascript:setTimeout(function(){window.open(‘http://www.baidu.com‘,‘_blank‘)},2000);">百度</a>

也就是说,用户触发一个事件后,事件处理函数所执行的window.open会被认为是合理的不会被阻止;但是,如果是由异步方式再执行window.open 会被浏览器阻止,因为浏览器认为不是由用户主支发起的,而是js代码自己发起的。这里就涉及到js前端代码经常会用到的ajax调用了,如果用到ajax时用的是异步执行(默认都是异步执行),那么就会经常出现window.open会被阻止。解决的方法是把ajax设置成同步。

$.ajax({  

           async: false, //就是设置这个最为关键的ajax同步  

           type: ‘POST‘,  

           url: ctx + "/sales/submitBank",  

           data: orderPost,  

           success: function(datas){  

               result = datas;  

           }  

       }); 

以上描述同样适用于form提交

Dwr可以直接改写参数:

async:false即可

时间: 2024-08-03 17:04:06

浏览器阻止新窗口(window.open或新窗的form提交)的相关文章

Js基础01-打开新窗口(window.open)

JavaScript-打开新窗口(window.open) open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法:  window.open([URL],[窗口名称],[参数字符串]);  参数说明: URL:可选参数,在窗口中要显示网页的网址或路径.如果省略这个参数,或者它的值是空字符串,那么窗口就不显示任何文档. 窗口名称:可选参数,被打开窗口的名称. 1.该名称由字母.数字和下划线字符组成. 2."_top"."_blank"."_se

ajax请求成功后新窗口window.open()被拦截的解决方法

ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了(不过如果是 _self 的话就不会有这个限制),即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截. 解决方法: 1.异步改为同步,即:async:false 2.将新开窗口指向为一个对象,然后修改对象的 ur

新方法删除对象的key(适用于form提交类数据)

我们只需要 efg参数,abcd是不需要的 1.传统方法 const data = {a:1,b:2,c:3,d:4,e:5,f:6,g:7} delete data.a Reflect.deleteProperty(data, "b"); delete data.c Reflect.deleteProperty(data, "d"); 2.解构 const data = {a:1,b:2,c:3,d:4,e:5,f:6,g:7} const {a,b,c,d,..

通过&lt;base&gt;标签实现全网页新窗口链接。

对比前一篇博文通过<meta>标签实现全网页新窗口链接. 使用<base>标签,不光可以实现全网页新窗口链接,更可以设定自定义的基底地址. 什么叫基底地址? 比如你某个网页的地址是a.com/1.html,但是你希望该网页下所有相对地址"/xxx/xxx"指向的是b.com/xxx/xxx,而不是a.com/xxx/xxx,就需要在<head>标签中使用这个<base>标签. 具体使用方法: <base href="链接地

Js打开新窗口拦截问题整理

一.js打开新窗口,经常被拦截 //js打开新窗口,经常被拦截 //指定本窗口打开,可以使用 window.open('http://www.tianma3798.cn', '_self'); //不指定或指定新窗口打开被拦截 window.open('http://www.tianma3798.cn'); window.open('http://www.tianma3798.cn', '_blank'); 二. 1.如果是用户点击操作,打开新窗口不被拦截 2.如果在ajax回调函数中调用打开新

winform中关闭退出和打开新窗口的几种方式

关闭窗口,退出的两种方式:1.this.Close();//关闭当前窗口2.Application.Exit();//关闭所有窗口,退出应用程序 打开窗口的三种方式:1.从一个窗口打开另一个窗口新窗口对象.show()2.从一个窗口打开另一个对话框新窗口对象.showDialog()3.在一个窗口内部打开另一个窗口(MDI父窗体) 1)先设置父窗口属性IsMdiContainer 为True 2)new 一个新窗口对象后,新窗口对象.MdiParent = this; 3)新窗口对象.Show(

浏览器对新窗口打开页面的阻止情况

事情是这样的:我们后台人员有一个需求,希望在ajax请求成功后的回调函数里,新窗口打开一个页面.示例代码如下: $("#btn").on("click",function(){ $.ajax({ url : "opendata.html", type : "post", data : {"a" : 1}, success : function(){ window.open("http://www.

JS打开新窗口防止被浏览器阻止的方法

这篇文章主要介绍了JS打开新窗口防止被浏览器阻止的方法,分析对比了常用方法与改进方法,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了JS打开新窗口防止被浏览器阻止的方法.分享给大家供大家参考.具体分析如下: 用传统的window.open()方式打开新窗口,会被浏览器阻止,那么,我们如何才能让JS打开新窗口不被浏览器阻止呢?其实办法还是有的,这里我们就来分析一下如何解决这个问题 我最近也遇到了这样的问题,所以就把弹出新窗口的方法分享给大家.欢迎大家补充哦... 第一种.使用原生javas

window.open打开新窗口被浏览器拦截的处理方法

一般我们在打开页面的时候, 最常用的就是用<a>标签,如果是新窗口打开就价格target="_blank"属性就可以了, 如果只是刷新当前页面就用window.location.reload(), 在某些特殊情况下也要用到另外一种新窗口打开的方法,就是window.open(),这个方法有一个问题就是会被基本所有的浏览器所拦截,要收到点击确认打开才可以,这样的体验可以说是非常不友好的~~ 感觉像一个有病毒的程序~~ 所以我们如果一定要用这个方法,但是又不想其被浏览器拦截,