Pobierz aktualny adres URL z IFRAME

91

Czy istnieje prosty sposób uzyskania bieżącego adresu URL z elementu iframe?

Widz przechodziłby przez wiele witryn. Zgaduję, że użyłbym czegoś w javascript.

chris
źródło
2
Jeśli przyszedłeś tutaj i szukasz adresu URL strony „nadrzędnej” elementu iframe, zobacz stackoverflow.com/q/3420004/32453
rogerdpack

Odpowiedzi:

166

Ze względów bezpieczeństwa adres URL można pobrać tylko wtedy, gdy zawartość elementu iframe i odwołujący się kod javascript są obsługiwane z tej samej domeny. O ile to prawda, coś takiego zadziała:

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

Jeśli te dwie domeny są niezgodne, napotkasz ograniczenia bezpieczeństwa dotyczące skryptów odwołań między witrynami.

Zobacz także odpowiedzi na podobne pytanie .

kkyy
źródło
czy wiesz, czy rozwiązanie podane w zwycięskiej odpowiedzi działa? Nie mogłem go uruchomić na moim komputerze (IE, Windows)
chris
Mówiłem o linku, który podałeś do podobnego pytania.
chris
Nie ma zwycięskiej odpowiedzi w pytaniu, które połączyłem ... jeśli masz na myśli najwyższą odpowiedź, to nie jest tak naprawdę działające rozwiązanie. Dzięki IE możesz wypróbować podejście HTA, które znalazło się także w odpowiedziach na powyższe pytanie.
kkyy
18
To nie działa, jeśli źródło iframe pochodzi z innej domeny.
konfile
A co, jeśli dodamy atrybut sandbox="allow-same-origin"do iFrame?
Roel
26

Jeśli element iframe pochodzi z innej domeny (międzydomenowej), inne odpowiedzi ci nie pomogą ... będziesz musiał po prostu użyć tego:

var currentUrl = document.referrer;

i - tutaj masz główny adres URL!

ParPar
źródło
28
-1 OP szuka aktualnego adresu URL elementu iframe, a nie strony odsyłającej do strony nadrzędnej.
Christophe,
15
@Christophe - wiem, ale może to pomóc osobom szukającym głównego adresu URL i przyszło do tego pytanie!
ParPar
6
gr8 .. To mi pomaga
Vikky
1
To jest dokładnie to, czego szukałem, i rozwiązuje mój problem bez wyświetlania mi błędu X-Script. +1 za to
Ulysses Alves
1
Świetnie, potrzebuję url iframe, a nie rodzica :)
speti43
4

Mam nadzieję, że to trochę pomoże, jak w twoim przypadku cierpiałem z dokładnie tym samym problemem i właśnie użyłem localstorage do udostępniania danych między oknem nadrzędnym a ramką iframe. Więc w oknie nadrzędnym możesz:

localStorage.setItem("url", myUrl);

A w kodzie, w którym źródło iframe po prostu pobiera te dane z localstorage:

localStorage.getItem('url');

Zaoszczędził mi dużo czasu. O ile wiem, jedynym warunkiem jest dostęp do kodu strony nadrzędnej. Mam nadzieję, że to komuś pomoże.

Beny
źródło
4
lokalna pamięć działa tylko w tej samej domenie ... więc po co się z tym wszystkim kłopotać? po prostu wyszukaj lokalizację.href
Yuki
3

Jeśli jesteś w kontekście iframe,

mógłbyś

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

Jeśli jesteś w nadrzędnym oknie / ramce, możesz użyć odpowiedzi https://stackoverflow.com/a/938195/2305243 , która brzmi

document.getElementById("iframe_id").contentWindow.location.href
Alan Dong
źródło
1

Wystąpił problem z atrybutami href url obiektu BLOB. Tak więc, nawiązując do elementu iframe, właśnie utworzyłem adres URL z atrybutu src elementu 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");
    }
Obrabować
źródło
0

Dodatkowe informacje dla każdego, kto może mieć z tym problem:

Otrzymasz wartości null, jeśli próbujesz pobrać adres URL z elementu iframe przed załadowaniem. Rozwiązałem ten problem, tworząc całą ramkę iframe w javascript i uzyskując potrzebne wartości za pomocą funkcji 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);

Ze względu na zasady tego samego pochodzenia miałem problemy z dostępem do ramek „cross origin” - rozwiązałem to, uruchamiając lokalnie serwer sieciowy zamiast uruchamiać wszystkie pliki bezpośrednio z mojego dysku. Aby to wszystko działało, musisz uzyskiwać dostęp do elementu iframe za pomocą tego samego protokołu, nazwy hosta i portu co źródło. Nie jestem pewien, którego z nich brakowało / brakowało podczas uruchamiania wszystkich plików z mojego dysku.

Więcej informacji o obiektach lokalizacyjnych: https://www.w3schools.com/JSREF/obj_location.asp

GChuf
źródło
0

Jeśli znajdujesz się w elemencie iframe, który nie ma międzydomenowego źródła src lub src jest puste:

Następnie:

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
    }
}

Jeśli jesteś w elemencie iframe z cross domain src:

Następnie:

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
źródło