• ajax回调中window.open弹出的窗口会被浏览器拦截的解决方法


    存在问题:处理页面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, 把所有的请求都改成同步解决的,但是有隐患。

  • 相关阅读:
    ABB机器人的安全板短接详情
    基恩士HMI的跳转
    ABB 轴配置的使用(为什么需要关闭)
    ABB选项讲解
    法那科夹具夹取和放置的操作
    roboguide的夹具制作
    法那科机器人的基本介绍(创建文件)
    关于三菱触摸屏GT Designer3 仿真软件创建工程
    动态循环插入<option>,鼠标点击从数据库调取data
    ajax将众多行数组转json传入html页面循环传入table中
  • 原文地址:https://www.cnblogs.com/kelly2017/p/7268412.html
Copyright © 2020-2023  润新知