一、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

Ajax异步打开新页面弹框被拦截,无法将参数值传递到后台的更多相关文章

  1. ajax中打开新页面使用window.open方法被拦截的解决方法

    $('.testA').unbind('click').bind('click',function(){ var result=""; $.ajax({ url:'http://l ...

  2. HBuilder mui 手机app开发 Android手机app开发 ios手机app开发 打开新页面 预加载页面 关闭页面

    创建子页面 在mobile app开发过程中,经常遇到卡头卡尾的页面,此时若使用局部滚动,在android手机上会出现滚动不流畅的问题: mui的解决思路是:将需要滚动的区域通过单独的webview实 ...

  3. ajax回调打开新窗体防止浏览器拦截有效方法

    ajax回调打开新窗体防止浏览器拦截,就这么做! 问题剖析:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function click_fun(){    window ...

  4. JavaScript关闭窗口的同时打开新页面的方法

    做网页的时候需要弹出一个小窗口,然后要实现一个功能就是鼠标点击超链接关闭小窗口并打开一个新页面,就如同下图: 这是一个小窗口,点击超链接这个窗口会关闭并且会正常在浏览器打开新页面,首先写js关闭窗口的 ...

  5. Web设计中打开新页面或页面跳转的方法 js跳转页面

    Web设计中打开新页面或页面跳转的方法 一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx ...

  6. ASP.NET 后台打开新页面

    [TOC] Response.Write 这是最常见的后台打开新页面的方法. Response.Write("<script>window.open('~/FileView.as ...

  7. Web设计中打开新页面或页面跳转的方法

    一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx"); 2. 利用url地址打 ...

  8. springMVC接受json并打开新页面

    背景:框架中,两个web工程A,B,我的B工程开发了一个对外action接口,A来连,要实现的功能是,A的页面发起一个action请求,到达B的springmvc,通过验证后,打开一个B工程新的tab ...

  9. CefSharp中ChromiumWebBrowser打开新页面处理(_blank)

    原文:CefSharp中ChromiumWebBrowser打开新页面处理(_blank) 版权声明:欢迎转载,但是请保留出处说明 https://blog.csdn.net/lanwilliam/a ...

随机推荐

  1. shiro+redis实现session共享

    shiro配置内容

  2. pytest文档9-参数化parametrize

    前言 pytest.mark.parametrize装饰器可以实现测试用例参数化. parametrizing 1.这里是一个实现检查一定的输入和期望输出测试功能的典型例子 # content of ...

  3. C/C++之回调函数

    转自:http://www.cnblogs.com/chenyuming507950417/archive/2012/01/02/2310114.html 今天讨论下C/C++中的回调函数. 在理解“ ...

  4. 一个 MVC 框架以 MVVM 之「魂」复活了!

    GitHub: https://github.com/houfeng/mokit Mokit 最初编写于 2012 年,是一个面向移动应用的前端 mvc 框架,v3 版本进行了大量的重构或重写,并尽可 ...

  5. 为jquery ajax请求增加正在运行提示

    在jquery源码中增加showMask()方法调用: if ( xhrSupported ) { jQuery.ajaxTransport(function( options ) { // Cros ...

  6. MySQL解决[Err] 1206 - The total number of locks exceeds the lock table size问题

    MySQL解决[Err] 1206 - The total number of locks exceeds the lock table size问题 查看MySQL版本:mysql>show ...

  7. log4net 自定义Appender

    最近有个需求,使用log4net来记录日志,然后将数据保存到服务器端.一开始打算写一个windows service,定期上传日志. 后来又因为一些场景下不适应,因此直接改为保存内存中,到一定阀值之后 ...

  8. CSS:CSS+DIV布局网页

    现代网页布局:CSS+DIV: 一般的网页都是顺序布局的,很难达到我们需要的网页布局格式,此时使用DIV进行分层布局,类似于盒子,对每一部分内容进行设计.这是现在主流的网页布局方式,使用DIV+CSS ...

  9. java学习笔记1--开发环境平台总结

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note1.html,转载请注明源地址. 1.Java程序设计语言 Java程序设计语言是一种高 ...

  10. 公司上线流程 pushonline_alpha

     这是在公司将服务部署上线的一个记录,只是部署很小的python脚本,各公司不同,参考性不是很大 开始吧(版本管理是git) 1.整理好代码后:git add xxx.py git commit -m ...