存在问题:处理页面ajax请求过程中,异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法 来实现,最终都被浏览器拦截了。不会跳到对应的页面,如下

原因:浏览器之所以拦截新开窗口因为该操作不是用户主动触发的,它认为这是不安全的所以拦截了( _self 不会限制),即使 ajax 回调函数中执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,不能被安全执行,所以被拦截。

百度了很多方法:比如

1:下面两种封装的方法放到ajax中不起效

(1)function newOpenWindow(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();
  }

(2)function newOpenWindow(url) {
    var a = $('<a href="'+url+'" target="_blank"></a>')[0];
    var e = document.createEvent('MouseEvents');
    e.initEvent('click', true, true);
    a.dispatchEvent(e);
  }

2:通过定时器,无效(时间长短无关)

var newOpenWindow=window.open();
setTimeout(function(){
  newOpenWindow.location=locationurl;
}, 1000);

最终的解决方法如下

var newOpenWindow=window.open('about:blank');  // 在ajax外部先打开空白新窗口

 $.ajax({
    success:function(data){
       if(data){
          //window.open('http://www.jb51.net'); 这种方法会被浏览器拦截     (错误方法)
          newOpenWindow.location="http://www.baidu.com";  //异步成功之后再给新窗口的localtion赋值
     }
  }
 })

3:当遇到两层回调的时候,不用先弹页面的时候会出问题。

这次 解决方法:async:false, 把所有的请求都改成同步解决的,但是有隐患。

ajax回调中window.open弹出的窗口会被浏览器拦截的解决方法的更多相关文章

  1. C#中三种弹出信息窗口的方式

    弹出信息框,是浏览器客户端的事件.服务器没有弹出信息框的功能. 方法一: asp.net页面如果需要弹出信息框,则需要在前台页面上注册一个javascript脚本,使用alert方法.使用Client ...

  2. ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式

    一.问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下. 二.问题分析 浏览器之所以拦截新开窗口是因为该操作并 ...

  3. Android 软键盘弹出时把原来布局顶上去的解决方法

    键盘弹出时,会将布局底部的导航条顶上去. 解决办法: 在mainfest.xml中,在和导航栏相关的activity中加: <activity            android:name=& ...

  4. 移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究

    PC端解决方案 pc端的解决思路就是在弹出遮罩层的时候取消已经存在的滚动条,达到无法滚动的效果. 也就是说给body添加overflow:hidden属性即可,IE6.7下不会生效,需要给html增加 ...

  5. 打开Eclipse弹出“No java virtual machine was found..."的解决方法

    今天准备用Eclipse抓取Android应用崩溃log,打开Eclipse时发现运行不了有以下弹框 A Java Runtime Environment(JRE) or Java Developme ...

  6. Tecplot 360 安装后弹出“Is your Tecplot 360 EX liense valid?”解决方法

    在hosts文件中添加127.0.0.1 download.tecplot.com这句指令时,应注意1与download之间有空格!

  7. 打开PDF文件弹出阅读未加标签文档的解决方法

    在“高级”菜单的“辅助工具”选中“设置助手”,然后点选“设置屏幕阅读器选项”,下一步之后,将“忽略已加标签文档的阅读顺序”和“添加标签到文档之前进行确认”(有的版本显示的是“为文档加标签前确认”)前面 ...

  8. 安装android studio时候弹出unable to access android sdk add-on list解决方法

    本文转载自:http://www.cnblogs.com/rancvl/p/6081791.html Android Studio First Run 检测 Android SDK 及更新,由于众所周 ...

  9. 移动H5页面,Android手机下,input获取焦点弹出系统虚拟键盘时,挡住input解决方法

    最近在写移动端页面的时候,遇到一个问题,在Android手机下,虚拟键盘会将input框遮挡住,具体情况如下图所示: 正常页面显示  IOS端显示情况 Android端显示情况 解决方式: <t ...

随机推荐

  1. NYOJ 38 布线问题 (最小生成树 prim)

    题目链接 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测 ...

  2. webstorm vue代码修改后不更新问题

    把 safe write 的勾去掉就行了.

  3. bzoj 3224 裸平衡树

    裸的平衡树,可以熟悉模板用,写题写不出来的时候可以A以下缓解下心情. /************************************************************** P ...

  4. linux基础的基础命令操作

    一.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 操作:su - root 二.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 操作:ctrl ...

  5. C++类学习

    一.C++类的定义     C++中使用关键字 class 来定义类, 其基本形式如下:class 类名{ public: //行为或属性  protected: //行为或属性 private: / ...

  6. VC++/MFC中调用CHM帮助文档的方法

    转载:http://blog.csdn.net/hediping9811/article/details/23341387 (1)用Word编辑好帮助文档,并保存为网页格式,如mhtml格式. (2) ...

  7. Linux实现利用SSH远程登录服务器详解

    Linux实现利用SSH远程登录服务器详解 http://www.111cn.net/sys/linux/55152.htm

  8. 该配置节不能包含 CDATA 或文本元素

    当执行程序时报“该配置节不能包含 CDATA 或文本元素” ,有可能是你的web.config中有异常的文本节点,比如

  9. git常用命令收集

    [git远程操作命令] 1.$ git remote –v #查看本地配置的所有远程仓库,内容为远程仓库的地址和本地别名 harvey@harvey:~/node$ git remote -v nod ...

  10. Unicode(UTF-8, UTF-16)令人混淆的概念----我看完了 不错

    来自:http://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html ---------------------------------- ...