Domanda

Attualmente sto utilizzando un IFrame per eseguire il sandboxing dei contenuti generati dagli utenti su un sito Web.Ciò elimina qualsiasi problema di stile con i nostri fogli di stile principali.

Tuttavia, quando un utente genera un collegamento utilizzando il nostro editor di testo RTF, vorremmo che il collegamento si aprisse nel genitore e non solo nell'IFrame.Mi rendo conto che puoi impostare un target per il genitore, ma non abbiamo il controllo dell'utente e di ciò che inserisce nel suo contenuto.

Esiste un modo per dirottare gli HREF all'interno dell'IFrame in modo che tutti prendano di mira il genitore senza modificarli?Oppure utilizzare un po' di Javascript che possa essere iniettato universalmente in modo da non dover raschiare tutto il contenuto e sostituire l'obiettivo in modo programmatico?

Idealmente, uno script semplice in un unico punto sarebbe la soluzione migliore.

Pensieri?

SOLUZIONE FINALE

Ho usato una variante della risposta che ho selezionato...Mi ha portato nella giusta direzione.

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

È all'interno dell'IFrame con il contenuto.Alla fine si è rivelata la soluzione più semplice per il compito.

È stato utile?

Soluzione

Usalo per crearlo e avrai accesso a qualsiasi parte con la variabile $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 ); 
    }); 

Quindi puoi fare qualcosa del genere

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

Trovato qui: http://groups.google.com/group/jquery-en/browse_thread/thread/fb646741a6192540

Altri suggerimenti

Stesso dominio nell'iframe?SÌ.

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

Dominio diverso nell'iframe?NO.

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

restituisce un "Autorizzazione negata per ottenere la proprietà HTMLDocument.getElementsByTagName".

Potrebbero esserci dei modi per aggirare, ma almeno con il semplice JavaScript ci sono alcune protezioni contro gli iframe che interferiscono con i siti (immagina un frame dannoso attorno al sito web di una banca e puoi capire perché).

Ho risolto il problema del dominio incrociato tramite 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>

Poiché non è possibile accedere al frame principale, ho sostituito il corpo tramite ajax.

Risposta più semplice:

<head>
    <base target="_blank">
</head>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top