47 votes

Comment obtenir l'emplacement actuel d'un iframe?

J'ai construit une application de saisie de données de base permettant aux utilisateurs de parcourir du contenu externe dans un iframe et de saisir rapidement des données à partir de la même page. Une des variables de données est l'URL.

Idéalement, j'aimerais pouvoir charger l'URL actuelle de l'iframe dans un champ de texte avec du javascript. Je me rends compte maintenant que cela ne se produira pas en raison de problèmes de sécurité.

Est-ce que quelqu'un a fait quelque chose du côté serveur ? ou connait des contrôles de navigation dans le navigateur .Net. L'objectif ultime est simplement de donner à l'utilisateur une méthode facile d'extraire l'url de la page qu'ils consultent dans l'iframe. Ce n'a pas nécessairement à être un iframe, un navigateur dans le navigateur serait idéal.

Merci, Adam

50voto

J'ai fait quelques tests dans Firefox 3 en comparant la valeur de .src et .documentWindow.location.href dans un iframe. (Remarque : Le documentWindow est appelé contentDocument dans Chrome, donc au lieu de .documentWindow.location.href dans Chrome, ce sera .contentDocument.location.href.)

src est toujours la dernière URL qui a été chargée dans l'iframe sans interaction de l'utilisateur. C'est-à-dire, il contient la première valeur pour l'URL, ou la dernière valeur que vous avez définie avec JavaScript à partir de la fenêtre conteneur en faisant :

document.getElementById("myiframe").src = 'http://www.google.com/';

Si l'utilisateur navigue à l'intérieur de l'iframe, vous ne pouvez plus accéder à la valeur de l'URL en utilisant src. Dans l'exemple précédent, si l'utilisateur quitte www.google.com et que vous faites :

alert(document.getElementById("myiframe").src);

Vous obtiendrez toujours "http://www.google.com".

documentWindow.location.href est disponible uniquement si l'iframe contient une page dans le même domaine que la fenêtre conteneur, mais s'il est disponible, il contient toujours la bonne valeur pour l'URL, même si l'utilisateur navigue dans l'iframe.

Si vous essayez d'accéder à documentWindow.location.href (ou quoi que ce soit sous documentWindow) et que l'iframe est dans une page qui n'appartient pas au domaine de la fenêtre conteneur, cela provoquera une exception :

document.getElementById("myiframe").src = 'http://www.google.com/';
alert(document.getElementById("myiframe").documentWindow.location.href);
Erreur : Autorisation refusée pour obtenir la propriété Location.href

Je n'ai pas testé d'autres navigateurs.

J'espère que cela aide!

26voto

document.getElementById('iframeID').contentWindow.location.href

Vous ne pouvez pas accéder du tout à l'emplacement de l'iframe de domaine croisé.

2voto

Hannah Points 54

J'utilise ceci.

var iframe = parent.document.getElementById("theiframe");
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

var currentFrame = innerDoc.location.href;

1voto

Igoru Points 570

HTA fonctionne comme une application Windows normale.
Vous écrivez du code HTML, et enregistrez sous forme d'un fichier .hta.

Cependant, il y a, au moins, un inconvénient : le navigateur ne peut pas ouvrir un fichier .hta ; il est traité comme un programme .exe normal. Donc, si vous placez un lien vers un fichier .hta sur votre page web, il ouvrira une boîte de dialogue de téléchargement, vous demandant si vous souhaitez ouvrir ou enregistrer le fichier HTA. Si cela ne vous dérange pas, vous pouvez cliquer sur "Ouvrir" et cela ouvrira une nouvelle fenêtre (sans barres d'outils, donc pas de bouton Retour, ni barre d'adresse, ni barre de menu).

J'avais besoin de faire quelque chose de très similaire à ce que vous voulez, mais au lieu de iframes, j'ai utilisé un vrai frameset.
La page principale doit être un fichier .hta ; les autres devraient être des pages .htm normales (ou .php ou autre).

Voici un exemple d'une page HTA avec 2 cadres, où le premier contient un bouton et un champ de texte qui contient l'URL du deuxième cadre ; le bouton met à jour le champ :

frameset.hta

        Exemple HTA
  • Il y a une balise HTA:APPLICATION qui définit certaines propriétés du fichier ; c'est bien d'en avoir une, mais ce n'est pas obligatoire.
  • Vous DEVEZ placer application="yes" dans les balises des cadres. Cela indique qu'ils appartiennent également au programme et doivent avoir accès à toutes les données (sinon, les cadres afficheront toujours l'erreur que vous aviez auparavant).

topo.htm

        Topo

            function copia_url() {
                campo.value = parent.conteudo.location;
            }
  • Vous devriez remarquer que je n'ai pas utilisé de fonction getElement pour récupérer le champ ; sur un fichier HTA, tous les éléments qui ont un ID deviennent instantanément un objet.

J'espère que cela vous aidera, ainsi que d'autres qui tomberont sur cette question. Cela a résolu mon problème, qui semble être le même que le vôtre.

Vous pouvez trouver plus d'informations ici : http://www.irt.org/articles/js191/index.htm

Profitez =]

1voto

Brian Stinar Points 825

J'aime votre idée côté serveur, même si ma mise en œuvre proposée semble un peu ghetto.

Vous pourriez définir le .innerHTML de l'iframe sur le contenu HTML que vous récupérez côté serveur. Selon la façon dont vous récupérez cela, vous devrez faire attention aux chemins relatifs par rapport aux chemins absolus.

De plus, en fonction de la manière dont la page que vous récupérez interagit avec d'autres pages, cela pourrait ne pas fonctionner du tout (les cookies définis pour la page que vous récupérez ne fonctionneront pas à travers les domaines, peut-être que l'état est suivi en Javascript... Beaucoup de raisons pour lesquelles cela pourrait ne pas fonctionner.)

Je ne crois pas que suivre l'état actuel de la page que vous essayez de reproduire soit théoriquement possible, mais je ne suis pas sûr. Le site pourrait suivre toutes sortes de choses côté serveur, vous n'aurez pas accès à cet état. Imaginez le cas où lors du chargement d'une page, une variable est définie sur une valeur aléatoire côté serveur, comment captureriez-vous cet état?

Ces idées vous aident-elles?

-Brian J. Stinar-

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