4

我目前正在使用 IFrame 对网站上的用户生成内容进行沙箱处理。这消除了我们主要样式表的任何样式问题。

但是,当用户使用我们的富文本编辑器生成链接时,我们希望链接在父级中打开,而不仅仅是在 IFrame 中打开链接。我意识到您可以为父级设置目标,但我们无法控制用户以及他们在内容中输入的内容。

有没有办法劫持 IFrame 中的 HREF,以便它们都以父级为目标而不修改它们?或者使用一些可以普遍注入的Javascript,这样我就不需要浏览所有内容并以编程方式替换目标?

理想情况下,一个地方的简单脚本将是最好的解决方案。

想法?

最终解决方案

我使用了我选择的答案的变体......它让我朝着正确的方向前进。

<script>
  Event.observe(window, 'load', function() {
    $$('a').each(function(e) {
      e.writeAttribute('target', '_parent');
    });
  });
</script>

那在带有内容的 IFrame 内部。它最终成为该任务最简单的解决方案。

4

4 回答 4

5

iframe 中的相同域?是的。

<script type="text/javascript">
function hijacklinks(iframe){
  var as = iframe.contentDocument.getElementsByTagName('a');
  for(i=0;i<as.length;i++){
    as[i].setAttribute('target','_parent');
  }
}
</script>

<iframe src="http://example.com/test.html" onload="hijacklinks(this)"></iframe>

iframe中的不同域?不。

<iframe src="http://www.google.com/search?q=google+happy" onload="hijacklinks(this)"></iframe>

产生“拒绝获取属性 HTMLDocument.getElementsByTagName 的权限”。

可能有一些方法,但至少使用简单的 JavaScript,它们可以防止 iframe 与网站混在一起(想象一下银行网站周围的恶意框架,你可以理解为什么)。

于 2009-08-04T00:40:19.083 回答
2

使用它来创建它,您将可以使用 $body 变量访问任何部分:

$(function() { 
        var $frame = $('<iframe style="width:200px; height:100px;">'); 
        $('body').html( $frame ); 
        setTimeout( function() { 
            var doc = $frame[0].contentWindow.document; 
            var $body = $('body',doc); 
            $body.html('<h1>Test</h1>'); 
        }, 1 ); 
    }); 

所以你可以做这样的事情

$('a', $body).attr('target', '_parent');

在这里找到:http ://groups.google.com/group/jquery-en/browse_thread/thread/fb646741a6192540

于 2009-08-04T00:31:20.940 回答
1

最简单的答案:

<head>
    <base target="_blank">
</head>
于 2015-03-18T08:12:56.777 回答
0

我通过ajax解决了跨域问题..

function runAjaxDone(response) {
            $('body').html(response);
        }
        function callAjax(url) {
            $.ajax({ url: url + '&r=' + Math.random(), success: runAjaxDone });
            return false;
        }

<a runat="server" href="#"
                        onclick='<%# "callAjax(\"http://partners.thevoiceinternet.com/portal/Customer/Report/AgentReport.aspx?AgentID="+Eval("AgentID").ToString()+"&name="+Server.UrlEncode(Eval("SubAgentName").ToString())+"\"); return false;" %>'>
                        <asp:Label ID="lbl" runat="server" Text='<%# Eval("SubAgentName") %>'></asp:Label></a>

由于无法访问父框架,我通过ajax替换了body。

于 2011-11-12T07:11:40.750 回答