Получить текущий URL из IFRAME


91

Есть ли простой способ получить текущий URL-адрес из iframe?

Зритель просматривал несколько сайтов. Полагаю, я бы использовал что-нибудь в javascript.


2
Если вы пришли сюда , ища URL в «родительской» странице фрейма, см stackoverflow.com/q/3420004/32453
rogerdpack

Ответы:


166

По соображениям безопасности вы можете получить URL-адрес только до тех пор, пока содержимое iframe и ссылочный javascript обслуживаются из одного домена. Пока это правда, будет работать что-то вроде этого:

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

Если два домена не совпадают, вы столкнетесь с ограничениями безопасности межсайтовых ссылок сценариев.

См. Также ответы на аналогичный вопрос .


знаете ли вы, работает ли решение, предложенное в выигравшем ответе? Я не мог заставить его работать на моем компьютере (IE, windows)
Крис

Я имел в виду указанную вами ссылку на аналогичный вопрос.
Крис

В вопросе, который я связал, нет выигрышного ответа ... если вы имеете в виду самый верхний ответ, это действительно не рабочее решение. В IE вы можете попробовать подход HTA, который также содержится в ответах на вышеупомянутый вопрос.
kkyy 03

18
Это не работает, если ваш iframe src находится из другого домена.
confile

Что, если мы добавим атрибут sandbox="allow-same-origin"в iFrame?
Роэл

26

Если ваш iframe из другого домена (кросс-домен), другие ответы вам не помогут ... вам просто нужно будет использовать это:

var currentUrl = document.referrer;

и - вот и основной URL!


28
-1 OP ищет текущий URL-адрес iframe, а не реферер родительской страницы.
Christophe

15
@Christophe - Я знаю, но это может помочь людям, которые ищут основной URL и приходят к этому вопросу!
ParPar

6
gr8 .. Это мне помогает
Vikky

1
Это именно то, что я искал, и он решает мою проблему, не вызывая ошибок X-Script. +1 за это
Ulysses Alves

1
Отлично, мне нужен URL-адрес iframe, а не родительский :)
speti43

4

Надеюсь, это поможет каким-то образом в вашем случае, я столкнулся с той же проблемой и просто использовал localstorage для обмена данными между родительским окном и iframe. Итак, в родительском окне вы можете:

localStorage.setItem("url", myUrl);

И в коде, где источник iframe просто получает эти данные из localstorage:

localStorage.getItem('url');

Сэкономил много времени. Насколько я понимаю, единственным условием является доступ к коду родительской страницы. Надеюсь, это кому-то поможет.


4
локальное хранилище работает только в том же домене ... так зачем же все эти проблемы? просто запросите location.href
Юки

3

Если вы находитесь в контексте iframe,

ты мог бы сделать

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

Если вы находитесь в родительском окне / фрейме, вы можете использовать ответ https://stackoverflow.com/a/938195/2305243 , который

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

1

У меня возникла проблема с href-адресами blob-адресов. Итак, со ссылкой на iframe, я просто создал URL-адрес из атрибута src 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");
    }

0

Дополнительная информация для тех, кто борется с этим:

Вы получите нулевые значения, если попытаетесь получить URL-адрес из iframe до его загрузки. Я решил эту проблему, создав весь iframe в javascript и получив нужные мне значения с помощью функции 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);

Из-за политики одного и того же происхождения у меня были проблемы при доступе к фреймам с перекрестным происхождением - я решил это, запустив локальный веб-сервер вместо запуска всех файлов прямо с моего диска. Чтобы все это работало, вы должны иметь доступ к iframe с тем же протоколом, именем хоста и портом, что и источник. Не уверен, что из этого было / отсутствовало при запуске всех файлов с моего диска.

Также подробнее об объектах локации: https://www.w3schools.com/JSREF/obj_location.asp


0

Если вы находитесь внутри iframe, у которого нет междоменного src, или src пуст:

Затем:

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

Если вы находитесь внутри iframe с перекрестным доменом src:

Затем:

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;
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.