Отримати поточну URL-адресу з IFRAME


91

Чи існує простий спосіб отримати поточну URL-адресу з iframe?

Користувач переглядав кілька сайтів. Я здогадуюсь, я б використовував щось у javascript.


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

Відповіді:


165

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

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

Якщо два домени не збігаються, ви натрапите на обмеження безпеки між сценаріями між сайтами.

Див. Також відповіді на подібне запитання .


чи знаєте ви, чи працює рішення, запропоноване переможцем відповіді? Я не зміг змусити його працювати на комп’ютері (IE, Windows)
Кріс,

Я говорив про посилання, яке ви вказали на подібне питання.
Кріс

У питанні, яке я зв’язав, немає виграшної відповіді ... якщо ви маєте на увазі найвищу відповідь, це насправді не працює рішення. За допомогою IE ви можете спробувати підхід HTA, наданий також у відповідях на вищезгадане питання.
kkyy

18
Це не працює, якщо ваш iframe src з іншого домену.
конфіл

Що робити, якщо ми додамо атрибут sandbox="allow-same-origin"до iFrame?
Роел

26

Якщо ваш iframe з іншого домену (міждоменного), інші відповіді вам не допоможуть ... вам просто потрібно буде скористатися цим:

var currentUrl = document.referrer;

і - ось у вас основна URL-адреса!


28
-1 ОП шукає поточну URL-адресу iframe, а не реферала батьківської сторінки.
Крістоф

15
@Christophe - Я знаю, але це може допомогти людям, які шукають отримання головної URL-адреси, і прийшли до цього питання!
ParPar

6
gr8 .. Це мені допомагає
Віккі

1
Це саме те, що я шукав, і це вирішує мою проблему, не даючи мені помилки X-Script. +1 за це
Улісс Алвес

1
Відмінно, мені потрібна URL-адреса iframe, а не батьківська :)
speti43

4

Сподіваюся, це допоможе дещо, як у вашому випадку я страждав точно такою ж проблемою і просто використовував localstorage для обміну даними між батьківським вікном та iframe. Отже, у батьківському вікні ви можете:

localStorage.setItem("url", myUrl);

І в коді, де джерелом iframe є лише отримати ці дані з localstorage:

localStorage.getItem('url');

Мені заощадило багато часу. Наскільки я бачу, єдиною умовою є доступ до коду батьківської сторінки. Сподіваюся, це комусь допоможе.


4
локальне сховище працює лише в одному і тому ж домені ... так чому навіщо всі ці проблеми? просто запитайте розташування.
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

У мене виникла проблема з URL-адресами BLOB-об'єктів hrefs. Отже, з посиланням на 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

Якщо ви знаходитесь у внутрішньому фреймі, який не має міждоменного 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.