繁体   English   中英

如何获取iframe的当前位置?

[英]How do I get the current location of an iframe?

我已经构建了一个基本的数据输入应用程序,允许用户浏览iframe中的外部内容并从同一页面快速输入数据。 其中一个数据变量是URL。 理想情况下,我希望能够使用javascript将iframe当前网址加载到文本框中。 我现在意识到,由于安全问题,这不会发生。

有人在服务器端做过什么吗? 或者知道浏览器控件中的任何.Net浏览器。 最终目标是为用户提供一种简单的方法来提取他们在iframe中查看的页面的网址。它不一定是iframe,浏览器中的浏览器将是理想的。

谢谢,亚当

我在Firefox 3中做了一些测试,比较了iframe.src.documentWindow.location.href的值。 (注意: documentWindow在Chrome中称为contentDocument ,因此Chrome中的.documentWindow.location.href不是.contentDocument.location.href 。)

src始终是在没有用户交互的情况下在iframe中加载的最后一个URL。 即,它包含URL的第一个值,或者您从包含窗口使用Javascript设置的最后一个值:

document.getElementById("myiframe").src = 'http://www.google.com/';

如果用户在iframe内导航,则无法再使用src访问URL的值。 在前面的示例中,如果用户离开www.google.com,您执行以下操作:

alert(document.getElementById("myiframe").src);

您仍然可以获得“ http://www.google.com ”。

documentWindow.location.href仅在iframe包含与包含窗口位于同一域中的页面时可用,但如果它可用,则它始终包含URL的正确值,即使用户在iframe中导航也是如此。

如果您尝试访问documentWindow.location.href (或documentWindow.location.href下的任何documentWindow )并且iframe位于不属于包含窗口的域的页面中,则会引发异常:

document.getElementById("myiframe").src = 'http://www.google.com/';
alert(document.getElementById("myiframe").documentWindow.location.href);
Error: Permission denied to get property Location.href

我没有测试任何其他浏览器。

希望能帮助到你!

document.getElementById('iframeID').contentWindow.location.href

您根本无法访问跨域iframe位置。

我用这个。

var iframe = parent.document.getElementById("theiframe");
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

var currentFrame = innerDoc.location.href;

我喜欢你的服务器方面的想法,即使我提议的实现它听起来有点贫民窟。

您可以将iframe的.innerHTML设置为您抓取服务器端的HTML内容。 根据你如何抓住这个,你必须注意相对路径和绝对路径。

另外,根据您抓取的页面与其他页面的交互方式,这可能完全不起作用(为您抓取的页面设置的cookie不能跨域工作,也许Javascript中正在跟踪状态...有很多原因这可能行不通。)

我不相信跟踪您尝试镜像的页面的当前状态在理论上是可行的,但我不确定。 该站点可以跟踪服务器端的各种事物,您将无法访问此状态。 想象一下,在页面加载变量被设置为服务器端的随机值的情况下,您将如何捕获此状态?

这些想法对任何事都有帮助吗?

-Brian J. Stinar-

HTA的工作方式与普通的Windows应用程序类似
您编写HTML代码,并将其另存为.hta文件。

但是,至少有一个缺点:浏览器无法打开.hta文件; 它作为一个普通的.exe程序处理。 因此,如果您将.hta链接放到您的网页上,它将打开一个下载对话框,询问您是否要打开或保存HTA文件。 如果它不是你的问题,你可以点击“打开”它将打开一个新窗口(没有工具栏,所以没有后退按钮,既没有地址栏,也没有菜单栏)。

我需要做一些与你想要的非常相似的东西,但我使用的是真正的frameset ,而不是iframes
主页面必须是.hta文件; 另一个应该是正常的.htm页面(或.php或其他)。

这是一个包含2个帧的HTA页面的示例,其中顶部有一个按钮和一个文本字段,其中包含第二个帧URL; 按钮更新字段:

frameset.hta

<html>
    <head>
        <title>HTA Example</title>
        <HTA:APPLICATION id="frames" border="thin" caption="yes" icon="http://www.google.com/favicon.ico" showintaskbar="yes" singleinstance="no" sysmenu="yes" navigable="yes" contextmenu="no" innerborder="no" scroll="auto" scrollflat="yes" selection="yes" windowstate="normal"></HTA:APPLICATION>
    </head>
    <frameset rows="60px, *">
        <frame src="topo.htm" name="topo" id="topo" application="yes" />
        <frame src="http://www.google.com" name="conteudo" id="conteudo" application="yes" />
    </frameset>
</html>
  • 有一个HTA:APPLICATION标签,它为文件设置了一些属性; 它很好,但它不是必须的。
  • 需要在frames'标签处放置一个application="yes" 它表示它们也属于该程序,并且应该可以访问所有数据(如果不这样,帧仍然会显示之前的错误)。

topo.htm

<html>
    <head>
        <title>Topo</title>
        <script type="text/javascript">
            function copia_url() {
                campo.value = parent.conteudo.location;
            }
        </script>
    </head>
    <body style="background: lightBlue;" onload="copia_url()">
        <input type="button" value="Copiar URL" onclick="copia_url()" />
        <input type="text" size="120" id="campo" />
    </body>
</html>
  • 您应该注意到我没有使用任何getElement函数来获取字段; 在HTA文件中,具有ID的所有元素立即成为对象

我希望这可以帮助你和其他人解决这个问题。 它解决了我的问题,看起来和你一样。

您可以在此处找到更多信息: http//www.irt.org/articles/js191/index.htm

享受=]

您可以使用Ra-Ajax并将iframe包裹在内部,例如Window控件。 虽然总的来说我不鼓励人们使用iframe( 任何事情

另一种方法是在服务器上加载HTML并将其作为Label或其他内容直接发送到Window中。 看看这个Ajax RSS解析器如何加载源代码中的RSS项目,可以在这里下载(开源 - LGPL)

(免责声明;我与Ra-Ajax合作...)

您可以访问iframe的src属性,但这只会为您提供最初加载的URL。 如果用户在iframe中导航,则需要使用HTA来解决安全问题。

http://msdn.microsoft.com/en-us/library/ms536474(VS.85).aspx

查看链接,使用HTA并设置iframe的“application”属性将允许您访问document.href属性并解析所需的所有信息,包括DOM元素及其值(如果您愿意)。

这有帮助吗?

http://www.quirksmode.org/js/iframe.html

我只在firefox中测试过这个,但是如果你有这样的东西:

<iframe name='myframe' id='myframe' src='http://www.google.com'></iframe>

您可以使用以下方式获取其地址:

document.getElementById('myframe').src

不确定我是否正确理解你的问题但反正:)

好的,所以在这个应用程序中,有一个iframe,在其中为用户提供链接或一些容量,允许iframe浏览到某个外部站点。 然后,您要捕获用户浏览过的URL。

要记住的事情。 由于URL是外部源,因此您将通过javascript(或客户端访问)与此iframe交互的数量受限,这称为浏览器跨域安全性,因为显然您已发现。 有巧妙的解决方法,如这里提出的跨域,跨框架Javascript ,虽然我不认为这种工作适用于这种情况。

您可以根据需要随时访问所有可访问的位置。

我建议让代码更耐用,更不容易出错。 尝试使用配置为显示javascript错误的IE或FF浏览网页。 你会惊讶地发现有多少javascript错误被抛出,很大程度上是因为那里有很多容易出错的javascript,这只会继续激增。

此解决方案假定所讨论的iframe与运行javascript的“窗口”上下文相同。 (意思是,它没有嵌入到另一个框架或iframe中,在这种情况下,javascript代码会更复杂,您可能需要递归搜索窗口层次结构。)

<iframe name='frmExternal' id='frmExternal' src='http://www.stackoverflow.com'></frame>
<input type='text' id='txtUrl' />
<input type='button' id='btnGetUrl' value='Get URL' onclick='GetIFrameUrl();' />

<script language='javascript' type='text/javascript'>
function GetIFrameUrl()
{
    if (!document.getElementById)
    {
        return;
    }

    var frm = document.getElementById("frmExternal");
    var txt = document.getElementById("txtUrl");

    if (frm == null || txt == null)
    {
        // not great user feedback but slightly better than obnoxious script errors
       alert("There was a problem with this page, please refresh.");
       return;
    }

    txt.value = frm.src;
}
</script>

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM