我一直在研究 Frame busting buster(名字里有什么,呵呵),它让我的用户留在我的页面上并打开一个带有目标 URL 的新窗口。我正在使用 Lightbox 脚本来显示 iframe,这就是我正在做的事情:
1) 为所有 .lightbox 点击添加了一个事件,fe:
$('.lightbox').live("click", function(e) {
e.preventDefault();
$('#redirectURL').val($(this).attr('href'));
$(this).lightbox();
}
2)增加了一个框架破坏克星:
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://server-which-responds-with-204.com'
}
}, 1)
</script>
3)修改了框架破坏破坏代码以满足我的需求,它们是:
- 检测 iframe 是否要更改 window.top.location
- 如果是这样,请使用 204 服务器响应防止这种情况发生
- 打开一个新页面:
window.open( $('#redirectURL', '_blank' );
- 关闭灯箱:
$('.jquery-lightbox-button-close').click();
到目前为止,这就是我想出的:
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2;
redirectURL = $('#redirectURL').val();
if(redirectURL != "") {
window.top.location = 'http://www.****.com/ajax/nocontent.php';
window.open(redirectURL, "_blank");
$('.jquery-lightbox-button-close').click();
$('#redirectURL').val('');
} else {
window.top.location = 'http://www.****.com/ajax/nocontent.php';
}
}
}, 1);
// 编辑:Before I forget, 'nocontent.php' is a file that returns a 204 header
对于 Firefox,它就像我编写的那样,如果在 window.top.location 中检测到更改,它会打开一个新的框架/页面并阻止 iframe 重新加载顶部位置并将其四舍五入,它会关闭 jQuery 灯箱。
Safari/Chrome 的行为类似,它们会打开一个新的浏览器屏幕 ( not sure if theres an option to say target="_newtab" or something?
)。唯一不好的是他们并没有真正显示弹出窗口被阻止的消息,但我可以通过在我的网站上显示一个带有页面链接的弹出气球来解决这个问题。
Internet Explorer 真是令人震惊,是唯一剩下的害群之马。IE 不会打开新的弹出窗口,也不会阻止 iFrame 重置的 window.top.location,而是继续将整个页面刷新到“#targetURL”。它与默认破坏代码相同。所以这不是因为我的一些编辑。
任何能够在我的代码中发现错误的人?
此外,我需要进行一些修改,以查看请求是由 iframe 还是由用户本身发出的,因为现在用户确实没有选择通过更改工具栏中的地址或单击来离开我的页面链接,这并不是真正需要的大声笑。
提前致谢。