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

关于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

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


推荐阅读

    linux数据库同步命令?

    linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

    linux打命令输入密码?

    linux打命令输入密码?,密码,系统,状态,代码,管理,标的,位置,地址,名称,命令,L

    linux下用户权限命令?

    linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,

    linux登陆用户命令?

    linux登陆用户命令?,系统,工具,信息,地址,软件,工作,命令,数字,服务,名称,Lin

    linux用户名改名命令?

    linux用户名改名命令?,系统,密码,命令,代码,名称,用户名,用户,终端,主机名,

    linux输入命令后乱码?

    linux输入命令后乱码?,系统,乱码,中文,情况,环境,地方,名称,字符集,服务器,

    linux输入命令无反应?

    linux输入命令无反应?,密码,系统,数据,命令,工具,时报,信息,检测,文件,反应,L

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    linux命令改用户所属?

    linux命令改用户所属?,系统,文件,名称,用户组,命令,用户,名录,基本知识,所

    linux浏览网页的命令?

    linux浏览网页的命令?,工作,系统,传播,地址,命令,环境,发行,信息,网络,基础,l

    linux命令行输入引号?

    linux命令行输入引号?,系统,密码,命令,电脑,标准,地方,环境,管理,名字,表示,

    linux建立数据库命令?

    linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服

    linux系统用户组命令?

    linux系统用户组命令?,系统,管理,密码,代码,用户组,用户,命令,邮箱,电脑,名

    linux用户管理的命令?

    linux用户管理的命令?,系统,管理,信息,地址,工作,用户,单位,基础,数据,命令,L

    linux命令进数据库?

    linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,

    linux输入命令删除键?

    linux输入命令删除键?,名称,系统,档案,命令,文件,目录,不了,数据,文件夹,终

    linux用户退出命令行?

    linux用户退出命令行?,状态,档案,标准,系统,命令,文件,模式,编辑,指令,主机,l

    linux多个命令输入?

    linux多个命令输入?,系统,工具,工作,命令,电脑,地址,信息,软件,服务,连续,Lin

    linux清空表数据命令?

    linux清空表数据命令?,系统,数据,软件,名称,不了,命令,文件,电脑,地址,位置,L

    linux命令重复输入?

    linux命令重复输入?,软件,信息,状态,标的,工具,系统,命令,终端,模式,编辑,在l