Obtenir l'URL actuelle d'IFRAME

91

Existe-t-il un moyen simple d'obtenir l'URL actuelle à partir d'une iframe?

Le spectateur passerait par plusieurs sites. Je suppose que j'utiliserais quelque chose en javascript.

Chris
la source
2
Si vous êtes venu ici à la recherche de l'URL de la page "parent" de l'iframe, voir stackoverflow.com/q/3420004/32453
rogerdpack

Réponses:

166

Pour des raisons de sécurité, vous ne pouvez obtenir l'URL que tant que le contenu de l'iframe et le javascript de référence sont servis à partir du même domaine. Tant que cela est vrai, quelque chose comme ça fonctionnera:

document.getElementById("iframe_id").contentWindow.location.href

Si les deux domaines ne correspondent pas, vous rencontrerez des restrictions de sécurité de script de référence intersite.

Voir également les réponses à une question similaire .

kkyy
la source
savez-vous si la solution fournie par la réponse gagnante fonctionne? Je ne pouvais pas le faire fonctionner sur mon ordinateur (IE, Windows)
Chris
Je parlais du lien que vous avez indiqué vers la question similaire.
chris le
Il n'y a pas de réponse gagnante dans la question que j'ai liée ... si vous voulez dire la réponse la plus élevée, ce n'est pas vraiment une solution de travail. Avec IE, vous pouvez essayer l'approche HTA fournie également dans les réponses à la question susmentionnée.
kkyy
18
Cela ne fonctionne pas si votre iframe src provient d'un domaine différent.
confile le
Et si nous ajoutions l'attribut sandbox="allow-same-origin"à l'iFrame?
Roel
26

Si votre iframe provient d'un autre domaine, (cross domain), les autres réponses ne vous aideront pas ... vous devrez simplement utiliser ceci:

var currentUrl = document.referrer;

et - ici vous avez l'url principale!

ParPar
la source
28
-1 l'OP recherche l'url actuelle de l'iframe, pas le référent de la page parent.
Christophe
15
@Christophe - Je sais, mais cela peut aider les gens qui cherchent à obtenir l'url principale et sont venus à cette question!
ParPar le
6
gr8 .. Cela m'aide
Vikky
1
C'est exactement ce que je cherchais, et cela résout mon problème sans me donner d'erreur X-Script. +1 pour ça
Ulysses Alves
1
Excellent, j'ai besoin de l'url iframe, pas du parent :)
speti43
4

J'espère que cela vous aidera dans votre cas, j'ai souffert du même problème et j'ai simplement utilisé localstorage pour partager les données entre la fenêtre parent et l'iframe. Ainsi, dans la fenêtre parent, vous pouvez:

localStorage.setItem("url", myUrl);

Et dans le code où la source iframe est simplement obtenir ces données de localstorage:

localStorage.getItem('url');

Cela m'a fait gagner beaucoup de temps. Pour autant que je puisse voir, la seule condition est l'accès au code de la page parent. J'espère que cela aidera quelqu'un.

Beny
la source
4
le stockage local ne fonctionne que sur le même domaine ... alors pourquoi se lancer dans tous ces problèmes? interrogez simplement l'emplacement.href
Yuki
3

Si vous êtes dans le contexte iframe,

vous pourriez faire

const currentIframeHref = new URL(document.location.href);
const urlOrigin = currentIframeHref.origin;
const urlFilePath = decodeURIComponent(currentIframeHref.pathname);

Si vous êtes dans la fenêtre / le cadre parent, vous pouvez utiliser la réponse de https://stackoverflow.com/a/938195/2305243 , qui est

document.getElementById("iframe_id").contentWindow.location.href
Alan Dong
la source
1

J'ai eu un problème avec les hrefs d'URL blob. Donc, avec une référence à l'iframe, je viens de produire une URL à partir de l'attribut src de l'iframe:

    const iframeReference = document.getElementById("iframe_id");
    const iframeUrl = iframeReference ? new URL(iframeReference.src) : undefined;
    if (iframeUrl) {
        console.log("Voila: " + iframeUrl);
    } else {
        console.warn("iframe with id iframe_id not found");
    }
Rob
la source
0

Quelques informations supplémentaires pour tous ceux qui pourraient avoir des problèmes avec cela:

Vous obtiendrez des valeurs nulles si vous essayez d'obtenir l'URL de l'iframe avant son chargement. J'ai résolu ce problème en créant l'ensemble de l'iframe en javascript et en obtenant les valeurs dont j'avais besoin avec la fonction onLoad:

var iframe = document.createElement('iframe');
iframe.onload = function() {

    //some custom settings
    this.width=screen.width;this.height=screen.height; this.passing=0; this.frameBorder="0";

    var href = iframe.contentWindow.location.href;
    var origin = iframe.contentWindow.location.origin;
    var url = iframe.contentWindow.location.url;
    var path = iframe.contentWindow.location.pathname;

    console.log("href: ", href)
    console.log("origin: ", origin)
    console.log("path: ", path)
    console.log("url: ", url)
};

iframe.src = 'http://localhost/folder/index.html';

document.body.appendChild(iframe);

En raison de la politique de même origine, j'ai eu des problèmes lors de l'accès aux cadres "cross origin" - j'ai résolu cela en exécutant un serveur Web localement au lieu d'exécuter tous les fichiers directement à partir de mon disque. Pour que tout cela fonctionne, vous devez accéder à l'iframe avec le même protocole, nom d'hôte et port que l'origine. Je ne sais pas lequel de ces éléments était / manquait lors de l'exécution de tous les fichiers à partir de mon disque.

En outre, plus d'informations sur les objets de localisation: https://www.w3schools.com/JSREF/obj_location.asp

GChuf
la source
0

Si vous êtes à l'intérieur d'un iframe qui n'a pas de cross domain src, ou src est vide:

Ensuite:

function getOriginUrl() {
    var href = document.location.href;
    var referrer = document.referrer;
    // Check if window.frameElement not null
    if(window.frameElement) {
        href = window.frameElement.ownerDocument.location.href;
        // This one will be origin
        if(window.frameElement.ownerDocument.referrer != "") {
            referrer = window.frameElement.ownerDocument.referrer;
        }
    }
    // Compare if href not equal to referrer
    if(href != referrer) {
        // Take referrer as origin
        return referrer;
    } else {
        // Take href
        return href
    }
}

Si vous êtes dans un iframe avec cross domain src:

Ensuite:

function getOriginUrl() {
    var href = document.location.href;
    var referrer = document.referrer;
    // Detect if you're inside an iframe
    if(window.parent != window) {
        // Take referrer as origin
        return referrer;
    } else {
        // Take href
        return href;
    }
}
Basil Goldman
la source