首页 / 知识

关于asp.net:如何获取iframe的当前位置?

2023-04-14 05:46:00

关于asp.net:如何获取iframe的当前位置?

How do I get the current location of an iframe?

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

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

谢谢,
亚当


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

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

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

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

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

您仍然会获得" http://www.google.com"。

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

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

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

我尚未测试任何其他浏览器。

希望有帮助!


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

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


我用这个。

1
2
3
4
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。该按钮将更新字段:

框架集

1
2
3
4
5
6
7
8
9
10
<html>
    <head>
        HTA Example
        <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标记可以为文件设置一些属性。拥有它是很好的,但这不是必须的。
  • 您需要在帧的标签处放置application="yes"。它说它们也属于该程序,并且应该可以访问所有数据(如果不访问,则框架仍会显示以前的错误)。

拓扑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
    <head>
        Topo
        <script type="text/javascript">
            function copia_url() {
                campo.value = parent.conteudo.location;
            }
       
    </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包裹在例如窗口控件。虽然总的来说,我不鼓励人们使用iframe(用于任何用途)

另一种选择是将HTML加载到服务器上,并将其作为Label或其他内容直接发送到Window中。了解此Ajax RSS解析器如何在源中加载RSS项,可在此处下载(开源-LGPL)

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


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

http://msdn.microsoft.com/zh-cn/library/ms536474(VS.85).aspx

使用HTA检出链接,并设置iframe的" application"属性,将允许您访问document.href属性并解析出所需的所有信息,包括DOM元素及其值(如果需要)选择。


好,因此在此应用程序中,有一个iframe,其中向用户提供了链接或某种允许iframe浏览到某个外部站点的功能。然后,您正在寻找捕获用户浏览过的URL。

要记住的事情。由于该URL指向外部来源,因此您将无法通过javascript与iframe进行交互(或与此相关的客户端访问),这被称为"浏览器跨域安全性",因为您显然已经发现了这一点。 。此处提供了跨域,跨框架Javascript的巧妙解决方法,尽管我认为这种解决方法不适用于这种情况。

您需要访问的几乎是您需要的位置。

我建议使代码呈现的更具弹性,并减少出错的可能性。尝试将IE或FF配置为显示javascript错误,以浏览网页。您会惊讶地发现抛出了多少个JavaScript错误,主要是因为那里有很多容易出错的javascript,而且这些错误还在继续扩散。

此解决方案假定所讨论的iframe与运行javascript的"窗口"上下文相同。 (意味着,它没有嵌入另一个框架或iframe中,在这种情况下,JavaScript代码会涉及更多的内容,因此您可能需要递归地搜索窗口层次结构。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
&lt;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;
}

希望这会有所帮助。


这有帮助吗?

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

我只在firefox中测试过,但是如果您有类似这样的内容:

1
&lt;iframe name='myframe' id='myframe' src='http://www.google.com'>&lt;/iframex&gt;

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

1
document.getElementById('myframe').src

不确定我是否正确理解了您的问题,但无论如何:)


数据输入用户浏览

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢