我构建了一个基本的数据输入应用程序,允许用户在 iframe 中浏览外部内容并从同一页面快速输入数据。数据变量之一是 URL。理想情况下,我希望能够将 iframe 当前 url 加载到带有 javascript 的文本框中。我现在意识到,由于安全问题,这不会发生。
有人在服务器端做过什么吗?或知道浏览器控件中的任何 .Net 浏览器。最终目标是为用户提供一种简单的方法来提取他们在 iframe 中查看的页面的 url 它不一定必须是 iframe,浏览器中的浏览器将是理想的。
谢谢,亚当
我构建了一个基本的数据输入应用程序,允许用户在 iframe 中浏览外部内容并从同一页面快速输入数据。数据变量之一是 URL。理想情况下,我希望能够将 iframe 当前 url 加载到带有 javascript 的文本框中。我现在意识到,由于安全问题,这不会发生。
有人在服务器端做过什么吗?或知道浏览器控件中的任何 .Net 浏览器。最终目标是为用户提供一种简单的方法来提取他们在 iframe 中查看的页面的 url 它不一定必须是 iframe,浏览器中的浏览器将是理想的。
谢谢,亚当
我在 Firefox 3 中做了一些测试,.src
比较.documentWindow.location.href
了iframe
. (注意:documentWindow
是在 Chrome 中调用contentDocument
的,所以.documentWindow.location.href
在 Chrome 中它会是.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
的任何内容)并且 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;
HTA 像普通的 Windows 应用程序一样工作。
您编写 HTML 代码,并将其保存为 .hta 文件。
但是,至少有一个缺点:浏览器无法打开 .hta 文件;它作为普通的 .exe 程序处理。因此,如果您将指向 .hta 的链接放在您的网页上,它将打开一个下载对话框,询问您是否要打开或保存 HTA 文件。如果对您没有问题,您可以单击“打开”,它将打开一个新窗口(没有工具栏,因此没有返回按钮,既没有地址栏,也没有菜单栏)。
我需要做一些与您想要的非常相似的事情,但是iframes
我使用了真正的frameset
.
主页需要是一个.hta文件;另一个应该是普通的 .htm 页面(或 .php 或其他)。
这是一个有 2 个框架的 HTA 页面示例,其中顶部有一个按钮和一个文本字段,其中包含第二个框架 URL;按钮更新字段:
<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
标签可以为文件设置一些属性;拥有它很好,但不是必须的。application="yes"
在框架的标签处放置一个。它说它们也属于该程序,并且应该可以访问所有数据(如果您不这样做,框架仍会显示您之前遇到的错误)。<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>
我希望这对您以及其他解决此问题的人有所帮助。它解决了我的问题,看起来和你一样。
您可以在这里找到更多信息:http
://www.irt.org/articles/js191/index.htm
享受 =]
我喜欢你的服务器端想法,即使我提议的实现它听起来有点贫民窟。
您可以将 iframe 的 .innerHTML 设置为您在服务器端获取的 HTML 内容。根据你如何抓住它,你将不得不注意相对路径和绝对路径。
另外,根据您抓取的页面与其他页面的交互方式,这可能完全不起作用(为您抓取的页面设置的 cookie 将无法跨域工作,可能正在用 Javascript 跟踪状态......很多原因这可能行不通。)
我不相信跟踪您尝试镜像的页面的当前状态在理论上是可能的,但我不确定。该站点可以跟踪服务器端的各种事物,您将无法访问此状态。想象一下,在页面加载时,变量被设置为服务器端的随机值,你将如何捕获这种状态?
这些想法有什么帮助吗?
-Brian J. Stinar-
您可以使用Ra-Ajax并在其中包含一个 iframe,例如一个 Window 控件。虽然总的来说我不鼓励人们使用 iframe(对于任何东西)
另一种选择是在服务器上加载 HTML 并将其作为标签或其他内容的内容直接发送到窗口中。查看这个Ajax RSS 解析器如何加载源中的 RSS 项目,可以在此处下载(开源 - LGPL)
(免责声明;我与 Ra-Ajax 合作......)
Does this help?
http://www.quirksmode.org/js/iframe.html
I only tested this in firefox, but if you have something like this:
<iframe name='myframe' id='myframe' src='http://www.google.com'></iframe>
You can get its address by using:
document.getElementById('myframe').src
Not sure if I understood your question correctly but anyways :)
好的,所以在这个应用程序中,有一个 iframe,其中为用户提供了链接或一些容量,允许 iframe 浏览到某个外部站点。然后,您希望捕获用户浏览过的 URL。
要记住的事情。由于 URL 指向外部源,因此您可以通过 javascript(或客户端访问)与此 iframe 交互的数量受到限制,这被称为浏览器跨域安全性,显然您已经发现. 有一些巧妙的变通方法,如这里介绍的Cross-domain, cross-frame 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>
希望这可以帮助。
您可以访问 iframe 的 src 属性,但这只会为您提供最初加载的 URL。如果用户通过 iframe 在 iframe 中导航,则需要使用 HTA 来解决安全问题。
http://msdn.microsoft.com/en-us/library/ms536474(VS.85).aspx
查看链接,使用 HTA 并设置 iframe 的“应用程序”属性将允许您访问 document.href 属性并解析出您想要的所有信息,包括 DOM 元素及其值(如果您愿意)。