框架Busting buster不能完全适用于IE

时间:2011-09-29 08:39:54

标签: javascript jquery iframe framebusting

我一直在制作一个Frame破坏破坏者(名称中的内容,呵呵),它将我的用户保留在我的页面上并打开一个带有目标URL的新窗口。我正在使用Lightbox脚本来显示iframe,这就是我正在做的事情:

1)为所有.lightbox点击添加了一个事件,f.e:

$('.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没有打开一个新的弹出窗口,也没有阻止window.top.location由iFrame重置,只是继续刷新整个页面到'#targetURL ”。它与默认的破坏代码相同..所以这不是因为我的一些编辑。

任何能够在我的代码中发现错误的人?

此外,我需要进行一些修改,看看请求是由iframe还是由用户自己做出的,因为现在用户通过更改工具栏中的地址或者离开我的页面确实没有选项。通过点击链接,这不是真正需要大声笑。

提前致谢。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

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

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

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