2009-06-01 19 views
142

Bene, ho un IFrame, che chiama una stessa pagina di dominio. Il mio problema è che voglio accedere ad alcune informazioni da questo genitore Iframe da questa pagina chiamata (da JavaScript). Come posso accedere a questo Iframe?Come accedere a Iframe padre da JavaScript

Dettagli: ci sono diversi iframe come questo, che possono avere la stessa pagina caricata, perché sto programmando un ambiente Windows. Ho intenzione di chiudere questo Iframe, ecco perché ho bisogno di sapere quali dovrei chiudere da dentro di lui. Ho una matrice che mantiene i riferimenti a questi Ifram.

EDIT: Non ci iframe vengono generati dinamicamente

+0

anche se iframe sono generate dinamicamente, è possibile assegnare un nuovo ID unico, usando una sorta di contatore, finalmente non avete bisogno di sapere ID, ma è possibile cerca facilmente, vedi la mia risposta. –

risposta

13

è possibile utilizzare parent per accedere alla pagina principale. Quindi, per accedere a una funzione sarebbe:

var obj = parent.getElementById('foo'); 
+1

Kevin, il problema è conoscere l'id. Ho diversi Ifram e voglio accedervi dal codice all'interno di –

3

Prova questa, nel frame genitore impostare voi IFRAME come questo:

<iframe id="frame1" src="inner.html#frame1"></iframe> 
<iframe id="frame2" src="inner.html#frame2"></iframe> 
<iframe id="frame3" src="inner.html#frame3"></iframe> 

Nota che l'ID di ogni fotogramma è passato come un ancoraggio in lo src.

poi nel tuo html interna è possibile accedere l'id del fotogramma viene caricato in via location.hash:

<button onclick="alert('I am frame: ' + location.hash.substr(1))">Who Am I?</button> 

allora si può accedere parent.document.getElementById() per accedere al tag iframe da all'interno del iframe

+0

Sì, questa sarebbe la soluzione più logica, ma a volte ho bisogno di cambiare l'src dell'iframe .. e passando questo parametro hash o GET ogni richiesta non è bene .. –

+0

perché è male passare l'hash ogni volta? È visibile solo al browser, non al server e non influisce sulla memorizzazione nella cache come farebbe un parametro get. –

+0

ma dovrei occuparmene in ogni richiesta. –

118

Inoltre è possibile impostare nome e l'ID a valori pari

<iframe id="frame1" name="frame1" src="any.html"></iframe> 

in modo da essere in grado di utilizzare il codice seguente all'interno pagina figlio

parent.document.getElementById(window.name); 
+14

Forse non è ovvio per tutti, ma con questo metodo è possibile accedere a un oggetto libreria del genitore (solo se il genitore ha già caricato la libreria). Esempio: accedi a jQuery con parent. $ ('# Qualcosa') – Zsolti

+1

Questa soluzione è compatibile con IE5 + modalità di stranezza della compatibilità. – Slayner

+2

Aquatic, la tua risposta del 2009 mi ha ancora aiutato. Thnx –

28

Vecchia domanda, ma ho appena avuto lo stesso problema e ho trovato un modo per ottenere l'iframe. Si tratta semplicemente di iterare attraverso l'array frames [] della finestra genitore e testare il contenuto di WindowWindow rispetto alla finestra in cui è in esecuzione il codice. Esempio:

var arrFrames = parent.document.getElementsByTagName("IFRAME"); 
for (var i = 0; i < arrFrames.length; i++) { 
    if (arrFrames[i].contentWindow === window) alert("yay!"); 
} 

Oppure, utilizzando jQuery:

parent.$("iframe").each(function(iel, el) { 
    if(el.contentWindow === window) alert("got it"); 
}); 

Questo metodo salva l'assegnazione di un ID a ciascun iframe, che è buono nel vostro caso in quanto vengono create dinamicamente. Non sono riuscito a trovare un modo più diretto, dal momento che non è possibile ottenere l'elemento iframe usando window.parent - passa direttamente all'elemento della finestra genitore (saltando l'iframe). Quindi collegarsi a loro sembra l'unico modo, a meno che tu non voglia usare gli ID.

+1

: questo non ha funzionato esattamente come pubblicizzato, e ho dovuto usare contentWindow.document === documento. Non ho idea del perché. Anche in alcuni browser ho usato contentDocument. Bene, mi piace! – Christophe

+1

Mi scuso, devo ammettere che l'ho provato solo su Firefox. :) Tuttavia, ho avuto successo usando il metodo jQuery e contentWindow in più browser. Aggiornamento –

+1

: ho scoperto che è possibile utilizzare anche window.frameElement, ma non sono sicuro di quali browser lo supportino. – Christophe

5

Forse basta usare

window.parent 

nel vostro iframe per ottenere la convocazione del telaio/finestre. Se tu avessi più cornice di chiamata, è possibile utilizzare

window.top 
-1
// just in case some one is searching for a solution 
function get_parent_frame_dom_element(win) 
{ 
    win = (win || window); 
    var parentJQuery = window.parent.jQuery; 
    var ifrms = parentJQuery("iframe.upload_iframe"); 
    for (var i = 0; i < ifrms.length; i++) 
    { 
     if (ifrms[i].contentDocument === win.document) 
      return ifrms[i]; 
    } 
    return null; 
} 
+3

Forse spieghi ancora un po 'il tuo codice? – cereallarceny

73

Basta chiamare window.frameElement dalla pagina incorniciata. Se la pagina non è in una cornice, allora frameElement sarà null.

L'altro modo (ottenendo l'elemento finestra all'interno di un frame è meno banale) ma per ragioni di completezza:

/** 
* @param f, iframe or frame element 
* @return Window object inside the given frame 
* @effect will append f to document.body if f not yet part of the DOM 
* @see Window.frameElement 
* @usage myFrame.document = getFramedWindow(myFrame).document; 
*/ 
function getFramedWindow(f) 
{ 
    if(f.parentNode == null) 
     f = document.body.appendChild(f); 
    var w = (f.contentWindow || f.contentDocument); 
    if(w && w.nodeType && w.nodeType==9) 
     w = (w.defaultView || w.parentWindow); 
    return w; 
} 
+2

Grazie! Funziona su IE 6+, FF e Chrome! – rustyx

+1

'window.frameElement' restituisce' null' quando window e iframe hanno domini diversi, ad esempio i messaggi di origine incrociata. – Qwerty

9

volta id iframe è impostato, è possibile accedere iframe dal documento interno come mostrato di seguito.

var iframe = parent.document.getElementById(frameElement.id); 

Funziona bene in IE, Chrome e FF.

+0

Questo sembra un modo complesso di fare 'var iframe = frameElement' – Oriol

+0

frameElement restituisce l'oggetto nel contesto della finestra corrente, ma parent.document.getElementById (frameElement.id) restituisce l'oggetto nel contesto della finestra genitore, non puoi eseguire le funzioni javascript della finestra genitore con frameElement, provalo in jsfiddle e dammi ed esempio se puoi. –

+1

http://jsfiddle.net/pfwcnjev/ – Oriol

64

Si consiglia di utilizzare postMessage API.

Nella tua iframe, chiamare:

window.parent.postMessage({message: 'Hello world'}, 'http://localhost/'); 

Nella pagina che si sta includendo l'iframe è possibile ascoltare per eventi come questo:

window.addEventListener('message', function(event) { 
     if(event.origin === 'http://localhost/') 
     { 
     alert('Received message: ' + event.data.message); 
     } 
     else 
     { 
     alert('Origin not allowed!'); 
     } 

    }, false); 

Tra l'altro, è anche possibile chiamate ad altre finestre e non solo iframe.

Per saperne di più l'API postMessage su John Resigs blog here

+5

Penso che questa sia chiaramente la migliore risposta, il contenuto '