防止parent.window.opener.location刷新页面
前两天在调整底部的付费链接的时候无意间打开了其中一个,很诡异的事发生了,我点了链接,也在新选项卡中打开了页面,但是我博客的页面会被强制打开一个凡客的广告链接,在检查确定自己代码没有任何点击动作之后我怀疑自己网站被挂广告了!结果排查了很久也没有发现任何被挂的代码在哪里。
这时候我试着去看了下被打开的页面的源文件,这才发现,原来问题不是出在我自己的博客的代码,而是被这个打开的页面强制跳转到他的一个指定页面去了!!!尼玛!!!坑爹啊!!!真TM的流氓!!!
不过气愤之后我就在想,他怎么能把我的网页给跳转到其他网页去了?又没有在我网站挂任何代码,是啥原理呢?我们先看看他的代码吧:
if(parent.window.opener) parent.window.opener.location='http://click.linktech.cn/?m=vancl&a=A100046207&l=00113&l_cd1=0&l_cd2=0&u_id=lipinka2';
正是这个parent.window.opener.location把我的网页给强刷了!这东东以前很少见到过,于是昨天我和另外一位同事写代码测试了一把,发现这个东西还真的能把一个网站的来源页给跳转掉,不过有一个前提条件:a链接必须指定target属性为“_blank”,target值为其他的都不行,没有target属性也不行。
问题发现了,怎么解决呢?
最简单的办法就是不要设置target="_blank"。如果我们必须在新窗口或新选项卡中去打开链接肿么办呢?看下面的方法。
这个方法是从网上找来的,大致原理就是通过onclick事件去打开这个会导致跳转的链接,然后在onclick里面用open方法去打开链接,设置opener方法为null即可阻止页面跳转,具体解决代码如下:
function openSite(o){
win = window.open(o.href,"_blank");
win.opener = null;
return false;
}
调用示例:
<a href="http://localhost/demo.html" target="_blank" onclick="return openSite(this)">demo</a>
这个方法是目前比较好的办法,但是一点缺点是在每一个会导致跳转的链接的onclick事件里面都要调用,增加了工作量,治标不治本。最直接最彻底的办法就是全部a标签都不要设置target属性,让用户自己去选择改用什么方式去打开你这个链接,这样就不会被上面那串广告代码利用了。
针对上面的代码我做了如下的DEMO,欢迎测试!
最后,小小的鄙视一下有这种做法的网站,坑爹啊!
22#回复
2012-03-04 11:05