zoukankan      html  css  js  c++  java
  • Ajax异步打开新页面弹框被拦截,无法将参数值传递到后台

    一、Form提交,打开新页面被拦截

    手动触发Form提交打开新页面是不会被拦截的,但是如果通过Ajax异步处理回调后再程序自动触发Form提交的话,就会被浏览器当成广告弹框拦截

    1、暂时的解决办法:如果必须要在Ajax异步回调之后程序自动触发提交,两个方法

    1)可以将Form的method改为get方式,这样的话如果被拦截,只要选择允许弹框就可以打开新页面

    2)将target改为_self,在本页面中打开

    2、彻底的解决办法

    1)之所以浏览器认为打开新窗口不是由用户主动发起的,是因为ajax的异步请求导致,而ajax不仅可以进行异步请求,也可以进行同步请求,然后就把这段代码的ajax请求改为同步,调试通过,如下: 

    1. $.ajax({  
    2.     url:url,  
    3.     data:form.serialize(),  
    4.     dataType: 'json',  
    5.     async:false  
    6. }).done(function(o){  
    7.     if(o.success){  
    8.         if(o.data){  
    9.             window.open('http://www.XXX.com');  
    10.         }else{  
    11.             newwin.close();  
    12.             $(document).trigger('simpleDialog',['#dialog-has-order']);  
    13.         }  
    14.     }else{  
    15.         _onFailure();  
    16.     }  
    17. }).fail(_onFailure);  

            但是这种方法虽然解决了问题,但是也同样失去了我们使用ajax的实衷,而且这种方法在jquery的使用手册里也明确指出,其受到调用的接口的性能影响,如果长时间不响应,势必会锁住浏览器,失去异步响应的优势。
    2)后来通过进一步查找,据说淘宝有一种作法,就是在ajax执行之前先打开一个新窗口,这时候是同步的,所以不会有问题,然后在异步调用成功后使用location.href将其指向新的url,如果失败则将该窗口关闭,如下: 

    1. var newwindow=window.open("about:blank");  
    2. window.focus();  
    3. $.ajax({  
    4.     url:form.attr('action'),  
    5.     data:form.serialize(),  
    6.     dataType: 'json',  
    7.     async:false  
    8. }).done(function(o){  
    9.     if(o.success){  
    10.         if(o.data){  
    11.             newwindow.location.href="http://www.XXX.com";  
    12.                         newwindow.focus();  
    13.         }else{  
    14.             newwindow.close();  
    15.         }  
    16.     }else{  
    17.         newwindow.close();  
    18.     }  
    19. }).fail(function(){newwindow.close();});  

            但是这种方法带来一个问题,就是当失败后,会先打开一个窗口,然后再关闭,虽然一闪而过,但是对用户总是一个困扰,相对来说还不如将ajax改成同步,毕竟现在的互联网的访问速度,不至于会将浏览器锁住太长时间。

    参考文章:http://blog.csdn.net/yanhandle/article/details/8486638

  • 相关阅读:
    leetcode:Power of Two
    求二进制中1的个数
    leetcode:Contains Duplicate和Contains Duplicate II
    leetcode:Summary Ranges
    leetcode Database1(三)
    c++作业:使用函数调用的方法,实现求两个整数中大的数的程序。
    Java制作桌面弹球下载版 使用如鹏游戏引擎制作 包含2个精灵球同时弹动
    Java动画 重力弹球 如鹏游戏引擎 精灵 设计一个小球加速落地又减速弹起并反复直到停止的Java程序
    为什么方差的分母有时是n,有时是n-1 源于总体方差和样本方差的不同
    计算机应用第三次作业:自动开机自动关机 常用DOS命令 关于文件文件夹
  • 原文地址:https://www.cnblogs.com/yingsong/p/5018173.html
Copyright © 2011-2022 走看看