2011-02-10 13 views
9

hay una expresión simple para acceder al cuerpo iframe utilizando jquery. asume que la identificación de iframe es el marco.jquery iframe body selector

Quiero dar el controlador de eventos a iframe. por ejemplo,

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

pero, este código no funciona en IE.

ninguna idea alternativa me ayudan a ~

+1

Es el documento dentro del marco flotante en su dominio? –

+0

sí, el mismo dominio en el otro directorio –

+0

¿Cuál es el error que IE le ofrece? – meo

Respuesta

18

dan una propiedad de nombre para el elemento de marco flotante. Ahora se puede hacer referencia a ella como esto:

window.name_of_iframe 

Su marco flotante no puede tener jQuery es así, el uso de desplazamiento estándar es una manera más segura

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

Este será el elemento del cuerpo en el marco flotante. Esto es sin embargo utilizable por jQuery en la página de acogida, por lo que:

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

es su envoltorio jQuery para el elemento del cuerpo del marco flotante.

tener cuidado de hacer esto sólo si se carga el iframe:

$("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~"); 
    }); 
}); 

ACTUALIZACIÓN: probado en IE, y no es un comportamiento bastante starnge con él. En Firefox debes envolverlo dentro de un evento listo para documentos, pero en IE, tiene que estar afuera, justo después del elemento iframe. Esta versión funciona en IE y Firefox también.

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

ACTUALIZACIÓN 2: una versión más corta, pero tiene su inconveniente, que tiene que especificar la fuente del marco flotante en el javascript, pero funciona en todos los navegadores que he probado.

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

Actualización 3: Y una manera aún más sencilla para el final:

<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 para ayudar a cualquiera que tenga los mismos problemas que tuve con esto, la parte central de este script para configurar los estilos en el documento iFrame funcionó bien, pero en cuanto a enlazar a la función de carga del iFrame, encontré configurar el onload propiedad en HTML funcionó mucho mejor. – gb2d

+2

Ninguna de estas formas no funciona (probado en Chrome 40). –

+2

@Morteza es su mismo iframe origen, cargado desde el mismo dominio que la página principal? De lo contrario, la misma política de origen le impedirá acceder al contenido del marco – aorcsik