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

245

Comment obtenez-vous un <div>de l'intérieur d'un <iframe>?

joepour
la source

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.

geowa4
la source
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>
lukyer
la source
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

VishalDream
la source
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.

SkuraZZ
la source
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();
tendu
la source
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:

Jose V
la source
-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;
ashish naghate
la source