Obtener elemento desde un iFrame

Respuestas:

382
var iframe = document.getElementById('iframeId');
var innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;

Podrías más simplemente escribir:

var iframe = document.getElementById('iframeId');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

y se devolverá el primer documento interno válido.

Una vez que obtenga el documento interno, puede acceder a sus componentes internos de la misma manera que accedería a cualquier elemento en su página actual. ( innerDoc.getElementById... etc.)

IMPORTANTE: Asegúrese de que el iframe esté en el mismo dominio, de lo contrario no podrá acceder a sus componentes internos. Eso sería una secuencia de comandos entre sitios.

geowa4
fuente
44
Gran respuesta. ¿Sabía que puede hacer: var innerDoc = iframe.contentDocument || iframe.contentWindow.document; // más legible y significa lo mismo
David Snabel-Caunt
55
He visto personas confundidas por eso más que operadores ternarios. Parecen no saber que se devuelve el primero válido.
geowa4
55
de hecho, como he editado la respuesta a incluirlo, el tipo por encima de mi hombro me preguntó lo que hizo ...
geowa4
12
Probablemente sea mejor educar que usar código más complejo para simplificar :)
David Snabel-Caunt
1
@JellicleCat: Cualquier forma de hacerlo es una forma de "falsificación de solicitud en sitios cruzados", también conocido como "ataque con un solo clic" o "sesión"
CSharper
12

No olvide acceder al iframe después de cargarlo . Manera antigua pero confiable sin jQuery:

<iframe src="samedomain.com/page.htm" id="iframe" onload="access()"></iframe>

<script>
function access() {
   var iframe = document.getElementById("iframe");
   var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
   console.log(innerDoc.body);
}
</script>
lukyer
fuente
3
window.parent.document.getElementById("framekit").contentWindow.CallYourFunction('pass your value')

CallYourFunction() es función dentro de la página y esa acción de función en ella

VishalDream
fuente
55
Eso es llamar a una función desde un iFrame, no obtener una referencia al elemento.
Nick Mitchell
3

Las respuestas anteriores dieron buenas soluciones usando Javscript. Aquí hay una solución simple de jQuery:

$('#iframeId').contents().find('div')

El truco aquí es el .contents()método de jQuery , a diferencia del .children()que solo puede obtener elementos HTML, .contents()puede obtener tanto nodos de texto como elementos HTML. Es por eso que uno puede obtener el contenido del documento de un iframe al usarlo.

Más información sobre jQuery .contents(): .contents ()

Tenga en cuenta que el iframe y la página deben estar en el mismo dominio.

SkuraZZ
fuente
1

Ninguna de las otras respuestas me funcionó. Terminé creando una función dentro de mi iframe que devuelve el objeto que estaba buscando:

function getElementWithinIframe() {
    return document.getElementById('copy-sheet-form');
}

Luego llama a esa función así para recuperar el elemento:

var el = document.getElementById("iframeId").contentWindow.functionNameToCall();
estirado
fuente
0

Si el iframe no está en el mismo dominio, de modo que no puede obtener acceso a sus componentes internos desde el padre pero puede modificar el código fuente del iframe, entonces puede modificar la página mostrada por el iframe para enviar mensajes a la ventana principal, lo que permite compartir información entre las páginas. Algunas fuentes:

Jose v
fuente
-3

El siguiente código lo ayudará a encontrar datos de iframe.

let iframe = document.getElementById('frameId');
let innerDoc = iframe.contentDocument || iframe.contentWindow.document;
naghate ashish
fuente