187 votes

Comment accéder à l'Iframe parent à partir de JavaScript

J'ai une IFrame qui appelle une page du même domaine. Mon problème est que je veux accéder à certaines informations de cette Iframe parente à partir de la page appelée (à partir de JavaScript). Comment puis-je accéder à cette Iframe ?

Détails : Il y a plusieurs Iframes comme celle-ci, qui peuvent avoir la même page chargée, parce que je programme un environnement Windows. J'ai l'intention de fermer cette Iframe, c'est pourquoi j'ai besoin de savoir laquelle je dois fermer depuis son intérieur. J'ai un tableau qui garde les références à ces Iframes.

EDIT : Les iframes sont générées dynamiquement.

0 votes

Même si les iframes sont générés dynamiquement, vous pouvez attribuer un nouvel identifiant unique en utilisant une sorte de compteur, finalement vous n'avez pas besoin de connaître l'identifiant, mais vous pouvez faire des recherches facilement, voir ma réponse.

152voto

Aquatic Points 1827

Vous pouvez également définir des valeurs égales pour le nom et l'ID.

<iframe id="frame1" name="frame1" src="any.html"></iframe>

afin que vous puissiez utiliser le code suivant dans la page enfant.

parent.document.getElementById(window.name);

19 votes

Peut-être que ce n'est pas évident pour tout le monde, mais avec cette méthode vous pouvez accéder à un objet de bibliothèque du parent (seulement si le parent a déjà chargé la bibliothèque). Exemple : accéder à jQuery avec parent.$('#something')

1 votes

Cette solution est compatible avec le mode "quirks" d'IE5+.

0 votes

Même en 2016, cela fonctionne très bien en tant qu'élément d'une solution au problème de l'impression par IE du contenu d'un fichier de type iframe trop petit. Mais pourquoi cela fonctionne-t-il ? window.name renvoie une chaîne de caractères. Ce qui est différent dans l'utilisation de window.name plutôt que de transmettre le nom de l'identifiant sous forme de chaîne, ce qui ne fonctionne pas) ?

103voto

Ian Carter Points 201

Il suffit d'appeler window.frameElement de votre page encadrée. Si la page n'est pas dans un cadre, alors frameElement sera null .

L'autre façon (obtenir l'élément de la fenêtre à l'intérieur d'un cadre est moins trivial) mais par souci d'exhaustivité :

/**
 * @param f, iframe or frame element
 * @return Window object inside the given frame
 * @effect will append f to document.body if f not yet part of the DOM
 * @see Window.frameElement
 * @usage myFrame.document = getFramedWindow(myFrame).document;
 */
function getFramedWindow(f)
{
    if(f.parentNode == null)
        f = document.body.appendChild(f);
    var w = (f.contentWindow || f.contentDocument);
    if(w && w.nodeType && w.nodeType==9)
        w = (w.defaultView || w.parentWindow);
    return w;
}

2 votes

Merci ! Fonctionne sur IE 6+, FF et Chrome !

18 votes

window.frameElement renvoie à null lorsque la fenêtre et l'iframe ont des domaines différents, c'est-à-dire la messagerie d'origine croisée.

0 votes

@Qwerty avez-vous trouvé une solution ?

87voto

Kenneth Lynne Points 3294

Je recommande d'utiliser le API postMessage .

Dans votre iframe, appelez :

window.parent.postMessage({message: 'Hello world'}, 'http://localhost/');

Dans la page où vous incluez l'iframe, vous pouvez écouter des événements comme celui-ci :

window.addEventListener('message', function(event) {
      if(event.origin === 'http://localhost/')
      {
        alert('Received message: ' + event.data.message);
      }
      else
      {
        alert('Origin not allowed!');
      }

    }, false);

A propos, il est également possible de faire des appels à d'autres Windows, et pas seulement à des iframes.

Pour en savoir plus sur l'API postMessage, consultez le blog de John Resigs. aquí

7 votes

Je pense que c'est clairement la meilleure réponse, la <iframe> Le contenu n'a pas besoin de savoir quoi que ce soit sur le parent et vice versa. Ils doivent seulement obéir au simple contrat de message. Génial !

1 votes

Le <iframe> doit quand même connaître le domaine du parent, non ?

1 votes

@HomrZodyssey Le domaine parent n'est disponible qu'en tant que mécanisme de sécurité. S'il n'est pas connu, vous pouvez le définir. '*' .

31voto

ingredient_15939 Points 1010

Vieille question, mais je viens d'avoir le même problème et j'ai trouvé un moyen d'obtenir le iframe. Il s'agit simplement d'itérer dans le tableau frames[] de la fenêtre parent et de tester le contentWindow de chaque frame en fonction de la fenêtre dans laquelle votre code s'exécute. Exemple :

var arrFrames = parent.document.getElementsByTagName("IFRAME");
for (var i = 0; i < arrFrames.length; i++) {
  if (arrFrames[i].contentWindow === window) alert("yay!");
}

Ou, en utilisant jQuery :

parent.$("iframe").each(function(iel, el) {
  if(el.contentWindow === window) alert("got it");
});

Cette méthode évite d'attribuer un ID à chaque iframe, ce qui est une bonne chose dans votre cas puisqu'ils sont créés dynamiquement. Je n'ai pas trouvé de moyen plus direct, puisque vous ne pouvez pas obtenir l'élément iframe en utilisant window.parent - il va directement à l'élément parent de la fenêtre (en sautant l'iframe). Le fait de les parcourir en boucle semble donc être la seule solution, à moins que vous ne souhaitiez utiliser des ID.

1 votes

Mise à jour : cela n'a pas fonctionné exactement comme annoncé, et j'ai dû utiliser contentWindow.document===document. Je ne sais pas pourquoi. Aussi dans certains navigateurs j'ai utilisé contentDocument. Eh bien, j'aime ça !

1 votes

Toutes mes excuses, il est vrai que je ne l'ai testé que sous Firefox :) Cependant, j'ai réussi à utiliser la méthode jQuery et contentWindow dans plusieurs navigateurs.

1 votes

Mise à jour : J'ai découvert que vous pouvez également utiliser window.frameElement, mais je ne suis pas sûr que les navigateurs le supportent.

22voto

Kevin Points 57797

Vous pouvez utiliser parent pour accéder à la page parent. Donc pour accéder à une fonction, ce serait :

var obj = parent.getElementById('foo');

1 votes

Kevin, le problème est de SAVOIR l'identité. J'ai plusieurs Iframes, et je veux y accéder à partir du code à l'intérieur.

0 votes

Je reçois toujours le message "Blocked a frame with origin". autre-localhost:8000 " d'accéder à un cadre d'origine croisée. "

0 votes

DOMException : Blocage d'un cadre avec une origine "null" pour accéder à un cadre d'origine croisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X