web-dev-qa-db-fra.com

Accéder à la fenêtre parent depuis iframe (inter-domaines)

J'ai rencontré la tâche d'accéder à la fenêtre parent à partir d'iFrame, si la fenêtre dans iFrame a été chargée à partir d'un autre domaine. Si je comprends bien, tous les navigateurs modernes permettent désormais de le faire. Je suis donc ici pour trouver la meilleure solution.

Je vais accomplir cette prochaine façon:

J'ai une superposition avec un iFrame en son sein. Cela fonctionnera au lieu des fenêtres contextuelles pour empêcher les bloqueurs de fenêtres contextuelles de bloquer mon contenu. La tâche consiste à recharger la page principale lorsque le document dans l'iFrame termine certains travaux. Dans un document, qui sera chargé sur un iFrame, j'ajouterai

<div id="is_closed" class="false"></div>

Dans une fenêtre parent, j'ajouterai une fonction, qui sera appelée toutes les secondes et vérifiera si ce div a toujours le nom de classe "false". Lorsque cela sera changé en "vrai", j'appellerai quelques rappels.

Si vous avez une meilleure solution, partagez-la avec moi. Appréciera toute aide.

Edit: C'est impossible car il est non seulement impossible de manipuler la fenêtre parent à partir de la fenêtre enfant, mais vice versa également. Mon idée était de manipuler la fenêtre enfant à partir de la fenêtre parent. J'avais tort.

10
Vitaliy Lebedev

Si j'étais vous, je vérifierais window.postMessage. Il peut faire ce que vous voulez:

Pour référence, voir ce qui suit:

41
jeremysawesome

Si je comprends bien, tous les navigateurs modernes permettent désormais de le faire. Je suis donc ici pour trouver la meilleure solution.

Ceci est votre solution. Ce que vous demandez n'est pas possible.

Voir les questions connexes:

[~ # ~] modifier [~ # ~]

Comme mentionné dans les commentaires ci-dessous, @ la réponse de JeremysAwesome propose une méthode qui autoriserait les demandes interdomaines dans certaines circonstances. Voir la question SO ci-dessous pour plus d'informations.

Façons de contourner la même politique d'origine

13
James Hill

mais vous pouvez modifier l'attribut src de iframe (en ajoutant un #hashtag par exemple) et écoutez l'événement onhashchange dans la fenêtre enfant. Étant donné que vous êtes en mesure de changer les deux pages.

7
grilly

une autre façon serait de définir les iframes src sur javascript: lier 500 millisecondes après son chargement. Exemple:

setTimeout(function() {
  document.getElementsByTagName("iframe")[0].src = `javascript: 
      (function(){
          setInterval(function() {
          if (document.getElementById("is_closed").className.match(/true/g)) {
              ...//see @jeremysawesome on how to do window.postMessage
          }
      })()`
}, 500);

Bien que la réponse de @jeremysawesome ait fonctionné, cela fonctionnera sur une iframe intégrée, quel que soit le domaine hôte, c'est très bien lorsque vous travaillez avec des sites Web hébergés sur des domaines tels que blogspot.com qui ne vous permettent pas de modifier facilement ce type de contenu ...

Maintenant, vous devrez évidemment lancer window.postMessage, plus d'informations à ce sujet peuvent être trouvées sur @ la réponse de jeremysawesome