2011-02-10 16 views
9

Esiste una semplice espressione per accedere al corpo di iframe utilizzando jquery. supponiamo che l'id di iframe sia ilframe.selettore corpo iframe jquery

Desidero assegnare l'event handler all'iframe. per esempio,

$("#theframe").contents().find("body").click(function() { 
    alert("hello, you touched me~"); 
}); 

ma, questo codice non funziona in IE.

qualche idea alternativa aiutarmi ~

+1

è il documento all'interno del iframe sul tuo dominio? –

+0

sì, stesso dominio in altre directory –

+0

qual è l'errore che IE ti dà? – meo

risposta

18

Dare un nome di proprietà per l'elemento iframe. Ora è possibile fare riferimento in questo modo:

window.name_of_iframe 

tuo iframe non può avere jQuery così, con traslazione standard è un modo più sicuro

iframe_body = window.name_of_iframe.document.getElementsByTagName("body")[0]; 

Questo sarà l'elemento del corpo nel iframe. Questo è comunque utilizzabile da jQuery sulla pagina host, in modo da:

$(window.name_of_iframe.document.getElementsByTagName("body")[0]); 

è il vostro involucro jQuery per l'elemento del corpo del iframe.

Fare attenzione a fare questo solo se l'iframe viene caricato:

$("iframe[name=name_of_iframe]").load(function() { 
    var iframe_body = window.name_of_iframe.document.getElementsByTagName("body")[0]; 
    $(iframe_body).click(function() { 
     alert("hello, you touched me~"); 
    }); 
}); 

UPDATE: testato in IE, e non v'è un comportamento piuttosto starnge con esso. In Firefox devi avvolgerlo in un evento pronto per il documento, ma in IE, deve essere all'esterno, subito dopo l'elemento iframe. Questa versione funziona anche in IE e Firefox.

<iframe name="ifr" src="?if=1"></iframe> 
<script type="text/javascript"> 
var ifr_loaded = false; 
$("iframe").load(function() { 
    $(window.ifr.document.getElementsByTagName("body")[0]).click(function() { alert("s"); }); 
    ifr_loaded = true; 
}); 
$(function() { 
    if (!ifr_loaded) 
    { 
     $("iframe").load(function() { 
      $(window.ifr.document.getElementsByTagName("body")[0]).click(function() { alert("d"); }); 
     }); 
    } 
}); 
</script> 

UPDATE 2: una versione più corta, ma ha il suo svantaggio, che è necessario specificare la fonte del iframe in javascript, ma funziona in tutti i browser che ho provato.

<iframe name="ifr"></iframe> 
<script type="text/javascript"> 
$(function() { 
    $("iframe").load(function() { 
     $(window.ifr.document.getElementsByTagName("body")[0]).click(function() { alert("d"); }); 
    }).attr("src","/teszt/v/index.php?if=1"); 
}); 
</script> 

UPDATE 3: e un modo ancora più semplice per la fine:

<script type="text/javascript"> 
function init_iframe(obj) { 
    $(obj.document.getElementsByTagName("body")[0]).click(function() { alert("d"); }); 
} 
</script> 
<iframe name="ifr" src="?if=1" onload="init_iframe(window.ifr);"></iframe> 
+1

Solo per aiutare chi ha gli stessi problemi con questo, la parte principale di questo script per l'impostazione degli stili sul documento iFrame ha funzionato bene, ma come per il collegamento alla funzione di caricamento dell'iFrame, ho trovato l'impostazione del carico la proprietà in HTML ha funzionato molto meglio. – gb2d

+2

Nessuno di questi modi non funziona (testato in chrome 40). –

+2

@Morteza è la tua stessa origine iframe, caricata dallo stesso dominio della pagina principale? In caso contrario, lo stesso criterio di origine impedirà l'accesso ai contenuti del frame – aorcsik