2010-05-27 14 views
26

Ho 2 fotogrammi in una pagina come questa (home.html)Come accedere telaio (non iframe) contenuti da jQuery

<frameset rows="50%, 50%"> 
     <frame id="treeContent" src="treeContent.html" /> 
     <frame id="treeStatus" src="treeStatus.html" /> 
</frameset> 

e poi in un frame (treeStatus.html) I avere qualcosa di simile

<body style="margin: 0px"> 
<div id="statusText">Status bar for Tree</div> 
</body> 

che voglio dalla finestra in alto a manipolare il div si trova nella cornice del bambino tramite jQuery (ad esempio, mostrare e nascondere).

ho visto severalquestionslikethis e suggeriscono il seguente

$(document).ready(function(){ 

      $('#treeStatus').contents().find("#statusText").hide(); 
    }); 

Non so se questo funziona con iframe, ma nel mio caso dove ho semplici cornici non sembra funzionare. Il codice è inserito all'interno di home.html

Ecco alcune uscita dalla console di Firebug

>>> $('#treeStatus') 
[frame#treeStatus] 
>>> $('#treeStatus').contents() 
[] 
>>> $('#treeStatus').children() 
[] 

Allora, come faccio accedere agli elementi del telaio dal telaio superiore? Mi sto perdendo qualcosa qui?

risposta

Dopo combinando entrambe le risposte qui, il modo corretto è

$('#statusText',top.frames["treeStatus"].document).hide(); 

A questo scopo il telaio deve avere il nome attributo parte la id, così:

<frameset rows="50%, 50%"> 
      <frame id="treeContent" src="treeContent.html" /> 
      <frame name="treeStatus" id="treeStatus" src="treeStatus.html" /> 
    </frameset> 
+0

solo una nota : perché usare i frame quando si può usare 'position: fixed' per aggiungere una barra di stato (o un log suggerito dalla dimensione) sempre nella parte inferiore del viewport ... supportando un browser antico? – alex

+0

@alex questo è solo un esempio minimale che ho creato per StackOverflow. La vera applicazione è completamente diversa. È più complicato delle semplici barre di stato. I frame sono un requisito (non chiedere!). – kazanaki

+0

OK, non preoccuparti. Ho solo pensato di aggiungere che (alcune persone non sanno di 'position: fixed'). – alex

risposta

11

È possibile prendere il fotogramma e div che si desidera manipolare e passarlo in una variabile.

var statusText = top.frames["treeStatus"].document.getElementById('statusText'); 

Quindi puoi fare tutto ciò che vuoi attraverso jQuery.

$(statusText).whatever(); 

Anche se a volte non si può andare in giro dover utilizzare i frame, tenere a mente che il tag <frame> è obsoleto in HTML5. Se hai intenzione di passare a HTML5, dovrai utilizzare iFrame.

+0

Non esattamente quello che volevo perché credo che l'intero scopo di jQuery è di evitare getElementById. Comunque la tua risposta mi ha aiutato a fare ciò che voglio, quindi lo accetto. – kazanaki

+0

great post man, ha funzionato come un fascino –

5

È necessario fornire un riferimento al telaio che cosa accedere a:

$("some selector", top.frames["treeStatus"])) 
+2

Ho provato questo e non funziona da solo. Dopo aver visto la risposta di Portable, l'ho fatto funzionare con $ ("qualche selettore", top.frames ["treeStatus"]. Document)) e aggiungendo anche "treeStatus" come nome a parte dall'id – kazanaki

4

Ho frame nidificati.Nel mio caso, per farlo funzionare ho usato il comando:

var statusText = 
top.document.getElementById("treeStatus").contentDocument.getElementById("statusText"); 

Poi, come Charles già risposto, si può fare tutto quello che vuoi tramite jQuery:

$(statusText).whatever(); 
+0

contentDocument è quello che stavo cercando! Anch'io ho fotogrammi annidati, grazie per questo post! – NetWave

2

Per una soluzione jquery pura (che non richiede top.frames, ecc), il seguente sembra funzionare:

$('some selector for item from frame' ,$('frame selector')[0].contentDocument) 

Questo ha il vantaggio che funziona per frame nidificati:

$('inner frame item selector', $('inner frame selector', $('outer frame selector')[0].contentDocument)[0].contentDocument) 
Problemi correlati