4

現在、IFrameを使用して、ユーザーが生成したコンテンツをWebサイトでサンドボックス化しています。これにより、メインのスタイルシートに関するスタイリングの問題が解消されます。

ただし、ユーザーがリッチテキストエディターを使用してリンクを生成する場合は、IFrameでリンクを開くだけでなく、親でリンクを開く必要があります。親にターゲットを設定することはできますが、ユーザーとユーザーがコンテンツに入力する内容を制御することはできません。

IFrame内のHREFをハイジャックして、それらを変更せずにすべて親をターゲットにする方法はありますか?または、普遍的に注入できるJavascriptを少し使用して、すべてのコンテンツをスクレイプしてターゲットをプログラムで置き換える必要がないようにしますか?

理想的には、1つの場所にある単純なスクリプトが最善の解決策です。

考え?

エンドソリューション

私は選択した答えのバリエーションを使用しました...それは私を正しい方向に導きました。

<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 がサイトをいじるのを防ぐことができます (銀行の Web サイトの周りにある悪意のあるフレームを想像してみてください。その理由は理解できます)。

于 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で差し替えました。

于 2011-11-12T07:11:40.750 に答える