Nhận URL hiện tại từ IFRAME


91

Có cách nào đơn giản để lấy URL hiện tại từ iframe không?

Người xem sẽ đi qua nhiều trang web. Tôi đoán tôi sẽ sử dụng một cái gì đó trong javascript.


2
Nếu bạn đến đây để tìm kiếm URL của trang "mẹ" của iframe, hãy xem stackoverflow.com/q/3420004/32453
rogerdpack

Câu trả lời:


165

Vì lý do bảo mật, bạn chỉ có thể lấy url miễn là nội dung của iframe và javascript tham chiếu, được phân phát từ cùng một miền. Miễn là điều đó đúng, một cái gì đó như thế này sẽ hoạt động:

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

Nếu hai miền không khớp, bạn sẽ gặp phải các hạn chế về bảo mật tập lệnh tham chiếu trang web.

Xem thêm câu trả lời cho một câu hỏi tương tự .


bạn có biết nếu giải pháp được cung cấp bởi câu trả lời chiến thắng hoạt động? Tôi không thể làm cho nó hoạt động trên máy tính của mình (IE, windows)
chris

Tôi đã nói về liên kết mà bạn liệt kê cho câu hỏi tương tự.
chris

Không có câu trả lời nào chiến thắng trong câu hỏi mà tôi đã liên kết ... nếu bạn muốn nói câu trả lời trên cùng, nó thực sự không phải là một giải pháp hiệu quả. Với IE, bạn có thể thử cách tiếp cận HTA cũng được cung cấp trong câu trả lời cho câu hỏi nói trên.
kkyy

18
Điều này không hoạt động nếu iframe src của bạn đến từ một miền khác.
confile

Điều gì sẽ xảy ra nếu chúng ta thêm thuộc tính sandbox="allow-same-origin"vào iFrame?
Roel

26

Nếu iframe của bạn đến từ một miền khác, (miền chéo), các câu trả lời khác sẽ không giúp được bạn ... bạn chỉ cần sử dụng điều này:

var currentUrl = document.referrer;

và - ở đây bạn đã có url chính!


28
-1 OP đang tìm kiếm url hiện tại của iframe, không phải liên kết giới thiệu của trang mẹ.
Christophe

15
@Christophe - Tôi biết, nhưng nó có thể giúp những người đang tìm kiếm url chính và đã đến với câu hỏi này!
ParPar

6
gr8 .. Điều này giúp tôi
Vikky

1
Đây chính xác là những gì tôi đang tìm kiếm và nó giải quyết vấn đề của tôi mà không gây ra lỗi X-Script cho tôi. +1 cho điều đó
Ulysses Alves

1
Tuyệt vời, tôi cần url iframe, không phải url gốc :)
Speti43,

4

Hy vọng điều này sẽ giúp một số trong trường hợp của bạn, tôi gặp phải vấn đề tương tự và chỉ sử dụng localstorage để chia sẻ dữ liệu giữa cửa sổ mẹ và iframe. Vì vậy, trong cửa sổ cha, bạn có thể:

localStorage.setItem("url", myUrl);

Và trong mã mà nguồn iframe chỉ lấy dữ liệu này từ localstorage:

localStorage.getItem('url');

Tiết kiệm cho tôi rất nhiều thời gian. Theo như tôi có thể thấy điều kiện duy nhất là quyền truy cập vào mã trang mẹ. Hy vọng điều này sẽ giúp một ai đó.


4
lưu trữ cục bộ chỉ hoạt động trên cùng một miền ... vậy tại sao lại gặp phải rắc rối này? chỉ cần truy vấn vị
trí.href

3

Nếu bạn đang ở trong ngữ cảnh iframe,

bạn có thể làm

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

Nếu bạn đang ở trong cửa sổ / khung chính, thì bạn có thể sử dụng câu trả lời của https://stackoverflow.com/a/938195/2305243 , đó là

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

1

Tôi gặp sự cố với hrefs url blob. Vì vậy, với tham chiếu đến iframe, tôi vừa tạo một url từ thuộc tính src của 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

Một số thông tin bổ sung cho bất kỳ ai có thể gặp khó khăn với điều này:

Bạn sẽ nhận được giá trị null nếu bạn đang cố lấy URL từ iframe trước khi nó được tải. Tôi đã giải quyết vấn đề này bằng cách tạo toàn bộ iframe trong javascript và nhận các giá trị tôi cần với hàm 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);

Do chính sách nguồn gốc giống nhau, tôi đã gặp sự cố khi truy cập các khung "cross origin" - tôi đã giải quyết vấn đề đó bằng cách chạy cục bộ máy chủ web thay vì chạy tất cả các tệp trực tiếp từ đĩa của mình. Để tất cả những điều này hoạt động, bạn cần phải truy cập iframe với cùng một giao thức, tên máy chủ và cổng như nguồn gốc. Không chắc cái nào trong số này bị / bị thiếu khi chạy tất cả các tệp từ đĩa của tôi.

Ngoài ra, thông tin thêm về các đối tượng vị trí: https://www.w3schools.com/JSREF/obj_location.asp


0

Nếu bạn đang ở trong iframe không có miền chéo src hoặc src trống:

Sau đó:

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

Nếu bạn đang ở trong iframe có tên miền chéo src:

Sau đó:

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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.