从IFRAME获取当前URL


Answers:


165

出于安全原因,您只能获取iframe的内容以及引用javascript来自同一域的时间。只要这是对的,这样的事情就会起作用:

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

如果两个域不匹配,则会遇到跨站点引用脚本安全性限制。

另请参见类似问题的答案


您知道获胜者提供的解决方案是否有效?我无法在计算机上运行它(IE,Windows)
克里斯,克里斯,2009年

我说的是您列出的类似问题的链接。
克里斯,2009年

在我链接的问题中没有成功的答案...如果您是最高答案,那实际上不是可行的解决方案。使用IE,您可以尝试上述问题的答案中提供的HTA方法。
kkyy

18
如果您的iframe src来自其他域,则此方法无效。
提交

如果将属性添加sandbox="allow-same-origin"到iFrame怎么办?
Roel

26

如果您的iframe来自其他域(跨域),那么其他答案将无济于事...您将只需要使用以下方法:

var currentUrl = document.referrer;

-在这里,您有了主网址!


28
-1 OP正在寻找iframe的当前网址,而不是父页面的引荐来源网址。
Christophe

15
@Christophe-我知道,但是它可以帮助正在寻找主网址的人找到这个问题!
ParPar 2014年

6
gr8 ..这对我有帮助
Vikky 2014年

1
这正是我一直在寻找的东西,它可以解决我的问题,而不会给我X-Script错误。为此+1
尤利西斯·阿尔维斯

1
太好了

4

希望这将对您的情况有所帮助,让我遭受完全相同的问题,并且只是使用localstorage在父窗口和iframe之间共享数据。因此,在父窗口中,您可以:

localStorage.setItem("url", myUrl);

在iframe来源只是从localstorage获取此数据的代码中:

localStorage.getItem('url');

节省了我很多时间。据我所知,唯一的条件是访问父页面代码。希望这会帮助某人。


4
本地存储只能在相同的域上工作...那么为什么要解决所有这些麻烦呢?只需查询location.href
Yuki

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

我对Blob url hrefs有问题。因此,参考iframe,我只是从iframe的src属性生成了一个网址:

    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

一些可能为此苦苦挣扎的人的一些其他信息:

如果尝试在iframe加载之前获取URL,则将获得null值。我通过在javascript中创建整个iframe并使用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);

由于同源策略,在访问“跨源”帧时遇到了问题-我通过在本地运行Web服务器而不是直接从磁盘运行所有文件来解决了这一问题。为了使所有这些正常工作,您需要使用与原始协议,主机名和端口相同的协议访问iframe。当我从磁盘运行所有文件时,不确定其中哪一个丢失。

另外,有关定位对象的更多信息:https : //www.w3schools.com/JSREF/obj_location.asp


0

如果您位于没有跨域src的iframe内,或者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
    }
}

如果您位于具有跨域src的iframe中:

然后:

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;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.