Récupérer un élément depuis un iFrame


Réponses:


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

Vous pourriez plus simplement écrire:

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

et le premier document interne valide sera retourné.

Une fois que vous avez obtenu le document interne, vous pouvez simplement accéder à ses éléments internes de la même manière que vous accéderiez à n'importe quel élément de votre page actuelle. ( innerDoc.getElementById... etc.)

IMPORTANT: assurez-vous que l'iframe se trouve sur le même domaine, sinon vous ne pourrez pas accéder à ses éléments internes. Ce serait un script intersite.


4
Très bonne réponse. Saviez-vous que vous pouvez faire: var innerDoc = iframe.contentDocument || iframe.contentWindow.document; // plus lisible et signifie la même chose
David Snabel-Caunt

5
J'ai vu des gens plus confus que des opérateurs ternaires. Ils semblent ne pas savoir que le premier valide est retourné.
geowa4

5
en fait, alors que je modifiais la réponse pour l'inclure, le gars par-dessus mon épaule m'a demandé ce que cela faisait ...
geowa4

12
Il vaut probablement mieux éduquer que d'utiliser un code plus complexe pour plus de simplicité :)
David Snabel-Caunt

1
@JellicleCat: Toute façon de contourner ce problème est une façon de faire une "falsification de demande intersite", également connue sous le nom d'attaque "en un clic" ou de "session de session"
CSharper

12

N'oubliez pas d'accéder à iframe après son chargement . Moyen ancien mais fiable sans 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>

3
window.parent.document.getElementById("framekit").contentWindow.CallYourFunction('pass your value')

CallYourFunction() est la fonction à l'intérieur de la page et cette action de fonction sur elle


5
Cela appelle une fonction à partir d'un iFrame, sans obtenir de référence à l'élément.
Nick Mitchell

3

Les réponses ci-dessus ont donné de bonnes solutions en utilisant Javscript. Voici une solution jQuery simple:

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

L'astuce ici est la .contents()méthode de jQuery , contrairement à .children()ce qui ne peut obtenir que des éléments HTML, .contents()peut obtenir à la fois des nœuds de texte et des éléments HTML. C'est pourquoi on peut obtenir le contenu d'un document iframe en l'utilisant.

Pour en savoir plus sur jQuery .contents(): .contents ()

Notez que l'iframe et la page doivent être sur le même domaine.


1

Aucune des autres réponses ne fonctionnait pour moi. J'ai fini par créer une fonction dans mon iframe qui renvoie l'objet que je cherchais:

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

Ensuite, vous appelez cette fonction comme ceci pour récupérer l'élément:

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

0

Si l'iframe n'est pas dans le même domaine, de sorte que vous ne pouvez pas accéder à ses éléments internes à partir du parent, mais vous pouvez modifier le code source de l'iframe, vous pouvez modifier la page affichée par l'iframe pour envoyer des messages à la fenêtre parent, ce qui permet vous de partager des informations entre les pages. Quelques sources:


-3

Le code ci-dessous vous aidera à découvrir les données iframe.

let iframe = document.getElementById('frameId');
let innerDoc = iframe.contentDocument || iframe.contentWindow.document;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.