弹窗解决最终奥义,人类再再也无法阻止弹窗了!

—- 4月25日更新

这真的是弹窗最终奥义哦,噗~,以前曾写过一篇“终极弹窗解决方案,人类再也无法阻止弹窗了!”,这个终极版居然还是有漏洞,无奈只能另寻方法,连题目都不知道该如何拟定了,只好写一篇“人类再再也无法阻止弹窗了!”,你造么,我真不是来卖萌好么= o=

初衷:公司需求,点付款后,弹出一个支付是否成功的提示框,并在新窗口打开第三方支付页面,这种交互相信就算没做过,在网上也看到不少了。

再来回顾下之前的那篇文章:

终极弹窗解决方案,人类再也无法阻止弹窗了!

http://levi.cg.am/?p=1458

有两种方法,基本思路是这样的:生成一个form,或者生成一个a,然后为对方指向一个URL,并且target为_blank,OK一切都美满了,这样浏览器连弹窗都认不得了。

其实这里还有个更简单的方法,没想到浏览器这么好骗,比如下面这段代码,把jquery指向元素触发点击事件;通过返回一个false阻止事件:


1

2

3

4

$("#first").click(function(){

    window.open("http://levi.cg.am");

    return false;

});

那这样就完了吗?其实不然,比如来短Ajax,你看看会出现什么情况:


1

2

3

4

5

6

7

8

9

10

$("#first").click(function(){

    $.ajax({

        type: ‘POST‘,

        url: ‘/deposit/paypoints‘,

        success: function(re) {

            window.open("http://levi.cg.am");

            return false;

        }

    });

});

发现浏览器是不是发现你要弹窗了?神马情况?难道不是返回false了吗?

对,的确是返回false了,但是这里是一个“闭包函数”,返回的false值的对象是在ajax的success这个作用域下的,而并非事件对象下,当然没用啦

另外我还看过一个奇葩的版本,至于为什么奇葩嘛,大家自己分析,这里不说明了


1

2

3

4

5

6

7

8

9

10

11

12

$("#first").click(function(){

    $.ajax({

        type: ‘POST‘,

        url: ‘/deposit/paypoints‘,

        success: function(re) {

            // do sthing....

        }

    });

    window.open("http://levi.cg.am");

    return false;

});

那怎么对付阿贾克斯君呢?

弹窗解决最终奥义来啦!!

在这里我先将弹窗指向为一个对象,之后再对这个对象进行操作,比如说修改这个弹窗的URL神马的,听上去是不是很费解。先上代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

$("#first").click(function(){

    var w = window.open(), url, num = 0;

    $.ajax({

        type: ‘POST‘,

        url: ‘/deposit/paypoints‘,

        success: function(re) {

            url = re.url;

        },

        error:function(){

            w.close();

            num = 20;

        }

    });

    var utime = setInterval(function(){

        if (url) {

            w.location = url;

            clearInterval(utime);

        } else if(num > 20) {

            w.close();

            clearInterval(utime);

        }

        unum++;

    }, 200);

});

我再来分析一遍:

  1. 先简历一个window对象,我先open他
  2. 创造一个空的URL对象,等待接收URL
  3. 创造一个num,这里你可以叫他失败计数器
  4. 好啦,阿贾克斯君跑起来了,异步的,他只做两件事:
    1. 正确响应,赋值url
    2. 失败关闭window,设置失败计数器到峰值
  5. 创建一个0.2秒重复触发的定时器,做两个操作:
    1. 正确获取到url,告诉window对象URL是神马
    2. 失败计数器达到峰值,关闭window

简化版

说到上面已经实现了弹窗的基本步骤了,但是比较麻烦,一般人要求没那么高的话,其实计数器是可以省去的,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

$("#first").click(function(){

    var w = window.open();

    $.ajax({

        type: ‘POST‘,

        url: ‘/deposit/paypoints‘,

        success: function(re) {

            w.location = re.url;

        },

        error:function(){

            w.close();

        }

    });

});

说到这里,不知道你是否有了概念了,呃,没有。。。好吧,我再来个简单的例子,有兴趣的朋友慢慢悟哦~

转载自:http://levi.cg.am/archives/3453

时间: 2024-08-26 11:21:30

弹窗解决最终奥义,人类再再也无法阻止弹窗了!的相关文章

人类投资经理再也无法击败电脑的时代终将到来了...

人类投资经理再也无法击败电脑的时代终将到来了... 去年,美国一些最杰出的数学天才聚集到了曼哈顿典雅的Tribeca Rooftop会展活动中心,他们在那里饱览河畔美景,享用佳肴美酒,同时也着手解决一系列复杂的方程式,以决出谁才是数学极客之王. 这场年度盛会由数学博物馆(Museum of Mathematics)主办,该博物馆是谷歌(Google)和世界上最富有的一些华尔街量化交易者--其中包括文艺复兴科技公司(Renaissance Technologies)的亿万富豪创始人詹姆斯·西蒙斯(

[Windows] 解决VLC Media Player的Crash Reporting消息弹窗

运行环境:Windows 8.1 (64bits), VLC Media Player 2.1.3 异常描述:首次启动VLC播放影音文件时,一切正常.此后每次启动VLC都弹出"VLC Crash Reporting",点击"Yes"或"No"后,VLC会开始播放文件,一切正常. 解决方法:VLC安装完毕后,因为"%AppData%"中没有crashdump文件,VLC正常启动.VLC正常启动后,在"%AppData%

解决由于一个软件限制策略的阻止,windows无法运行此程序cmd.reg

解决由于一个软件限制策略的阻止,windows无法运行此程序cmd.reg Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\0\Paths\{28932aa4-77d2-452f-9436-d8c62a84208e}][-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\

解决bootstrap按钮点击后再移入出现蓝色边框

.btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: none; border-color: transparent; }

android获取当前运行Activity的名字(解决避免及时聊天再出现通知)

最近在做IM时需要知道当前Activity是哪一个Activity.自己整理一下两种方法 第一种:要方便一点 private String getRunningActivityName() { String contextString = context.toString(); return contextString.substring(contextString.lastIndexOf(".") + 1, contextString.indexOf("@"));

解决MVC Jquery"此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站"的问题

在ASP.NET MVC项目中,使用AJAX向控制器发送GET请求获取JSON数据时,出现这个错误:"此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站.若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet". 其实从返回的这个错误信息我们已经可以知道解决方法了,看这个信息:”因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站“,说明我们只要使用POST请求就可以了.后面的 “若要允许 GET 请求,请将 Jso

【jquery】ajax 请求成功后新开窗口被拦截解决方法

问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢? 分析: 浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了(不过如果是 _self 的话就不会有这个限制),即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所

技术晨读积累_20140526

#技术晨读# 初探单点登录 SSO 在多个应用中,如果你登录了其中一个应用,就可以登录其他应用了,这样的技术就是SSO(单点登录).步骤大概是母站上种一个cookie,当访问子站的时候,带cookie发起一次对母站的请求,母站认证后,带上认证信息产生重定向到子站的页面,进行cookie写入操作... http://daoluan.net/blog/single-sign-on #技术晨读# PHP API中,MYSQL与MYSQLI的持久连接区别 php与mysql的连接分为持久连接和短连接,作

再谈弹窗那些事

再谈弹窗那些事 很早之前对 jQuery 略懂的时候,写过一篇简单实现弹窗功能的文章,而且"不害怕"的发表到了我爱水煮鱼上.很基础,很简单,里面的有些做法都是不成熟的,只能说简单的实现了那么一个弹窗效果. 虽然写的很基础很一般,但是从统计数据来看,这篇文章还是有很多人搜索很多人看,再加上到现在过了的这一年多,做过很多遍弹窗功能,对简单的弹窗效果也有了进一步的理解,再次总结一篇更加深入的文章. 弹窗的实现原理和方法 弹窗通常就是两部分,一部分是半透明的背景遮罩,另一部分就是承载主体内容的