Maison >interface Web >js tutoriel >Résoudre le problème de communication entre la page parent et la page iframe grâce aux compétences pseudo-protocol_javascript

Résoudre le problème de communication entre la page parent et la page iframe grâce aux compétences pseudo-protocol_javascript

WBOY
WBOYoriginal
2016-05-16 16:05:461268parcourir

Nous avons souvent des opérations sur les pages parents et les pages iframe, comme

939370b3c8787d52ac84eef51d6f9a93065276f04003e4622c4fe6b64f465b88

Le contenu de cette iframe est écrit en js. Comme le code suivant

var iframe = document.getElementById("iframe"),
  doc = iframe.contentWindow.document;
doc.open();
doc.write("---------something------");
doc.close();

Le code ci-dessus est correct dans la plupart des cas. Mais il existe une situation où la page parent écrit explicitement document.domain = "xxx";

Dans la série IE (je ne l'ai pas essayé sur IE10), il y aura une erreur de non-autorisation. Il n'y a aucun problème dans Firefox et Chrome.

Pourquoi est-ce ? Il s'agit d'un bug dans IE, c'est-à-dire que lorsque la page parent ne définit pas explicitement document.domain, l'iframe sera par défaut le document.domain étant le même que la page parent, c'est-à-dire les deux. sont

location.host, les pages parent et enfant peuvent communiquer, c'est-à-dire l'exemple de l'en-tête de l'article, mais lorsque la page parent définit explicitement document.domain="", les pages de l'iframe doivent également définir explicitement document.domain = "xxx", sinon

Si vous n'avez pas l'autorisation d'obtenir iframe.contentWindow.document, vous ne pouvez pas écrire de contenu de manière dynamique. En fait, vous pouvez également faire pointer l'iframe vers une page spécifique. Cette page définit explicitement document.domain=". xxx", puis à travers l'article Le carré de départ

, mais le problème est que ma page parent contient de nombreux iframes de ce type, et le nombre est inconnu (tous sont des espaces publicitaires), elle ne peut donc pas transmettre une page spécifique.

Le problème se pose. Dans ce cas, nous semblons n'avoir aucune solution

1. La page parent est définie et doit définir explicitement document.domain

2. Le contenu de la page iframe doit être généré dynamiquement par js.

3. Aucune chance de définir src pour iframe.

Mais lorsque les trois conditions ci-dessus sont remplies, nous pouvons résoudre ce genre de problème grâce à un pseudo-protocole.

Copier le code Le code est le suivant :

iframe.src="javascript:void((function(){var d=document;d.open();d.domain='xxx;d.write('---something');d.close()} )())";

De cette façon, le document.domain de l'iframe peut être explicitement défini pour être cohérent avec la page parent.

Après avoir écrit ceci, la nécessité d'écrire dynamiquement du contenu iframe est effectivement réalisée, mais cette page apparaîtra séparément, comme window.open();
Pourquoi est-ce ? Il s'agit également d'un bug dans la série IE, c'est-à-dire que la page parent a 5d43740c2c81c12a30358e8bd80a5b616f6cb83b34cb7f2d6a4aed109317b73a, et le contenu écrit via le pseudo-protocole de l'iframe affichera un nouveau page comme window.open,
Mais le dde6fb694e6711ae5e6f381704c04ae4 de la page parent doit être _self, vous ne pouvez donc définir la cible de base que sur _self avant d'appeler iframe.src. Une fois le contenu écrit, définissez la cible de base sur _blank

.

Cela résout le problème.

Bien que les pseudo-protocoles puissent résoudre ce problème, il existe certains risques. N'utilisez pas cette méthode avec désinvolture, sauf si cela est absolument nécessaire.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn