Frage

Ich verwende derzeit einen IFrame, um benutzergenerierte Inhalte auf einer Website zu sandboxen.Dadurch werden jegliche Stilprobleme mit unseren Haupt-Stylesheets beseitigt.

Wenn ein Benutzer jedoch mit unserem Rich-Text-Editor einen Link generiert, möchten wir, dass der Link im übergeordneten Element geöffnet wird und nicht nur im IFrame.Mir ist klar, dass Sie ein Ziel für das übergeordnete Element festlegen können, aber wir haben keine Kontrolle über den Benutzer und dessen Eingaben in seinen Inhalt.

Gibt es eine Möglichkeit, die HREFs innerhalb des IFrame zu kapern, sodass sie alle auf übergeordnete Elemente abzielen, ohne sie zu ändern?Oder ein bisschen Javascript verwenden, das universell eingefügt werden könnte, sodass ich nicht den gesamten Inhalt durchsuchen und das Ziel programmgesteuert ersetzen muss?

Idealerweise wäre ein einfaches Skript an einer Stelle die beste Lösung.

Gedanken?

ENDLÖSUNG

Ich habe eine Variation der von mir ausgewählten Antwort verwendet ...Es hat mich in die richtige Richtung gebracht.

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

Das ist im IFrame mit dem Inhalt.Letztendlich war es die einfachste Lösung für die Aufgabe.

War es hilfreich?

Lösung

Verwenden Sie Folgendes, um es zu erstellen, und Sie haben Zugriff auf alle Teile mit der Variablen $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 ); 
    }); 

Dann können Sie so etwas tun

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

Hier gefunden: http://groups.google.com/group/jquery-en/browse_thread/thread/fb646741a6192540

Andere Tipps

Gleiche Domain im Iframe?Ja.

<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>

Andere Domain im Iframe?NEIN.

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

ergibt die Meldung „Berechtigung zum Abrufen der Eigenschaft HTMLDocument.getElementsByTagName verweigert“.

Es gibt vielleicht Auswege, aber zumindest mit einfachem JavaScript gibt es einige Schutzmaßnahmen gegen Iframes, die sich mit Websites herumschlagen (stellen Sie sich einen bösartigen Frame um die Website einer Bank vor, und Sie können verstehen, warum).

Ich habe das domänenübergreifende Problem über Ajax umgangen.

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>

Da auf den übergeordneten Frame nicht zugegriffen werden kann, habe ich den Körper über Ajax ersetzt.

Einfachste Antwort:

<head>
    <base target="_blank">
</head>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top