6

我一直在研究 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 还是由用户本身发出的,因为现在用户确实没有选择通过更改工具栏中的地址或单击来离开我的页面链接,这并不是真正需要的大声笑。

提前致谢。

4

2 回答 2

5

PENDO,我试图模拟你描述的整个过程,ligthbox-jquery,javascript他们自己的代码和控制通过灯箱打开页面。我根本无法模拟,随着时间的流逝,我正在发送一个建议以扩大可能性和解决方案的范围。我建议更换重定向页面:

 ...
  redirectUrl = $ ('# redirectUrl'). val ();
 ...
 window.top.location = 'http://www .****. with / ajax / nocontent.php';
 window.open (redirectUrl, "_blank");

替换为模拟页面的 DIV 容器,使用 ajax 调用并获取内容并覆盖 DIV 的内容。

 ...
 $.post(redirectoURL /* or desired URL */, function(data) {
     $('DIV.simulateContent').html(data);
 });
 ...

或者

 ...
 $('DIV.simulateContent').load(redirectoURL);
 ...

这种方法还避免了阻止用户甚至使用地址栏离开您的页面的问题(正如您自己提到的)。

对不起,让我给你一个完整的解决方案,但时间阻止了我。

PENDO,对问题的替代方案进行了更多工作,我找到了一个可自定义的 jQuery 灯箱插件,用于处理自定义窗口(iframe、html、内联 ajax 等)。也许会有所帮助。以下链接:

 http://jacklmoore.com/colorbox/
于 2011-10-08T11:11:25.220 回答
0

如果您不需要在 IE 中的 iframe 中运行 javascript,则可以设置 iframe 安全属性:

<iframe security="restricted" src="http://domain.com" />

http://msdn.microsoft.com/en-us/library/ms534622(v=VS.85).aspx

于 2011-10-07T22:14:07.373 回答