101 votes

Obtenir le contenu DOM d'un iframe de domaine croisé

J'ai un iframe pour un site cross-domain. Je veux lire le DOM de l'iframe, ce que je croyais possible car en utilisant l'inspecteur, je peux même modifier le DOM d'un iframe. Cependant, chaque fois que j'essaie de le lire, je me heurte à la politique d'origine partagée. Tout ce que je veux, c'est le contenu chargé dans mon DOM local, depuis l'iframe. Je pensais que ce serait aussi simple que $(document.body).find('iframe').html(), mais cela renvoie la chaîne vide.

J'espère vraiment qu'il y a un moyen de le faire car le travail que j'ai fait ces derniers jours repose sur la possibilité de le faire.

Merci

104voto

SinistraD Points 2080

Vous ne pouvez pas. Protection XSS. Les contenus de sites croisés ne peuvent pas être lus par JavaScript. Aucun navigateur majeur ne vous le permettra. Je suis désolé, mais c'est une faille de conception, vous devriez abandonner l'idée.

MODIFIER

Notez que si vous avez un accès d'édition au site web chargé dans l'iframe, vous pouvez utiliser postMessage (voir également la compatibilité du navigateur)

26voto

Clément Gournay Points 299

Il y a une façon simple.

  1. Vous créez un iframe qui a pour source quelque chose comme "http://votre-domaine.com/index.php?url=http://le-site-que-vous-voulez-obtenir.com/unicorn

  2. Ensuite, il vous suffit de récupérer cette URL avec $_GET et d'afficher le contenu avec file_get_contents($_GET['url']);

Vous obtiendrez un iframe qui a un domaine identique au vôtre, puis vous pourrez utiliser $("iframe").contents().find("body") pour manipuler le contenu.

9voto

Bandrami Points 151

Si vous avez accès à la page iframée, vous pourriez utiliser quelque chose comme easyXDM pour effectuer des appels de fonction dans l'iframe et renvoyer les données.

Si vous n'avez pas accès à la page iframée, vous devrez utiliser une solution côté serveur. Avec PHP, vous pourriez faire quelque chose de rapide et peu élégant comme :

7voto

Maksim Luzik Points 63

Si vous avez accès à ce domaine/iframe qui est chargé, alors vous pouvez utiliser window.postMessage pour communiquer entre l'iframe et la fenêtre principale.

Lisez le DOM avec JavaScript dans l'iframe et envoyez-le via postMessage à la fenêtre supérieure.

Plus d'informations ici : https://developer.mozilla.org/fr/docs/Web/API/Window/postMessage

1voto

Thuy Nguyen Points 31

Il y a une solution de contournement pour y parvenir.

  1. Tout d'abord, liez votre iframe à une page cible avec une URL relative. Les navigateurs traiteront le site dans l'iframe du même domaine que votre site Web.

  2. Sur votre serveur Web, utilisez un module de réécriture pour rediriger les demandes de l'URL relative vers l'URL absolue. Si vous utilisez IIS, je vous recommande de vérifier le module IIRF.

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