有两种方法,基本思路是这样的:生成一个form,或者生成一个a,然后为对方指向一个URL,并且target为_blank,OK一切都美满了,这样浏览器连弹窗都认不得了。
其实这里还有个更简单的方法,没想到浏览器这么好骗,比如下面这段代码,把jquery指向元素触发点击事件;通过返回一个false阻止事件:
1
2
3
4
|
$( "#first" ).click( function (){
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) {
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....
}
});
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);
});
|
我再来分析一遍:
- 先简历一个window对象,我先open他
- 创造一个空的URL对象,等待接收URL
- 创造一个num,这里你可以叫他失败计数器
- 好啦,阿贾克斯君跑起来了,异步的,他只做两件事:
- 正确响应,赋值url
- 失败关闭window,设置失败计数器到峰值
- 创建一个0.2秒重复触发的定时器,做两个操作:
- 正确获取到url,告诉window对象URL是神马
- 失败计数器达到峰值,关闭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();
}
});
});
|