论坛首页 Web前端技术论坛

不会被拦截的JS打开新窗口的方法

浏览 15370 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-01-19   最后修改:2012-02-06

 

之前利用隐藏form提交打开新窗口的方式,被chrome干掉了,无奈,只要想出下面的方法

 

思路是利用JS的事件冒泡机制

 

clickOpenWin: function(f){
		var dataKey = "clickOpenWin.dataKey"
		var me = $(this);
		var A = me.data(dataKey);
		
		var returnData = null;
		if(!A){
			A = $("<A target='_blank' class='proxyA'>");
			me.data(dataKey, A);
			A.click(function(e){
				if(returnData){
					A.attr("href", returnData);
				}else {
					A.before(me);
					e.stop();
				}
			});
		}
		me.mouseover(function(){$(this).before(A).appendTo(A);});
		me.mouseout(function(){A.before($(this));});
		me.click(function(){
			A.attr("href", "#|");
			returnData = f.apply(this, arguments);
		});
	}


看不明白。。。。。

那我就简单做几点说明:

 

1. 首先,说一下最终的效果,是实现用 “A” 包含你要触发弹窗的元素,原来的click事件要返回弹窗的URL 对应这一句 “returnData = f.apply(this, arguments);”

 

2. 然后就要说到弹窗拦截的策略了,具体我就不说了,反正 策略里是不会拦截 “A” 本身吧

 

3. 最后就是合成了,用A包含后,因为事件会冒泡,所以利用正常的点击,生成动态的 链接地址 给A,触发A的原始点击事件,就完成了

 

其余的自己体会吧

   发表时间:2012-02-03  
楼主,解释一下吧。。鄙人才疏学浅
0 请登录后投票
   发表时间:2012-02-03  
确实需要注释一下
0 请登录后投票
   发表时间:2012-02-04  
什么啊 ,看不懂。。。。。
0 请登录后投票
   发表时间:2012-02-06  
target='_blank'
用了a链接弹出窗口
0 请登录后投票
   发表时间:2012-02-06  
哎哟,有人耍流氓

做网站非得做流氓网站?
0 请登录后投票
   发表时间:2012-02-07   最后修改:2012-02-07
gtssgtss 写道
哎哟,有人耍流氓

做网站非得做流氓网站?



本来想说这方面的问题来,因为,我说的这个方法不能用来“耍流氓”,所以就没说。

但既然你这样说了,那我就必须再说明一下:

正如我在第3点中说到的,此方面是利用用户的“正常点击”(也就是主动点击行为),才能触发。而利用脚本事件是不能触发A的href效果的,所以我不是在“耍流氓”。

那我为什么还要写这个呢?

还不是因为真正的“流氓”把原来的“良家妇女”(浏览器)调戏成“泼妇”了,合理的弹出窗口也被拦截了,所以才无奈费了半天劲,想出这个办法。
0 请登录后投票
   发表时间:2012-02-18   最后修改:2012-02-18
偶才疏学浅,对apply对象冒充函数不太熟悉,今天特意翻了一下JS手册,里面给出一个apply的demo演示说明“对象冒充”的原理,才弄明白楼主的思路,这个“冒充”思路太妙了

所点击那个href,不一定是原来的那个href,有可能是被神不知鬼不觉给冒充替换的href....

下面这个apply函数冒充原理
<script type="text/javascript">
function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.apply(this, arguments);//A对象被B对象冒充了,秘密就在这里...

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor();//print blue
objB.sayColor();//print red(为啥blue被red替代了,秘密在上面...)
objB.sayName();

</script>


0 请登录后投票
   发表时间:2012-04-26  
window.document.body  注册点击事件  触发弹出窗口  
0 请登录后投票
   发表时间:2012-04-30  
我有一件事没搞明白:
我在firefox下,设置了“需要打开新窗口时用标签页代替”,但是浏览某些流氓网页时,却可以自动弹出新窗口,是怎么做到的?
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics