如何获取iframe的当前位置?
我已经build立了一个基本的数据input应用程序,允许用户浏览iframe中的外部内容,并从同一页面快速input数据。 其中一个数据variables是URL。 理想情况下,我想能够加载的JavaScript的iframes当前url到一个文本框。 我现在意识到,由于安全问题,这不会发生。
有没有人在服务器端做过任何事情? 或了解浏览器控件中的任何.Net浏览器。 最终目标是给用户提供一个简单的方法来提取他们在iframe中查看的页面的URL。它不一定是一个iframe,浏览器中的浏览器将是理想的。
谢谢,亚当
我在Firefox 3中做了一些testing,比较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位于不属于包含窗口域的页面中,则会引发exception:
document.getElementById("myiframe").src = 'http://www.google.com/'; alert(document.getElementById("myiframe").documentWindow.location.href); Error: Permission denied to get property Location.href
我还没有testing任何其他浏览器。
希望它有帮助!
document.getElementById('iframeID').contentWindow.location.href
您根本无法访问跨域iframe位置。
HTA像一个正常的Windows应用程序一样工作。
您编写HTML代码,并将其另存为.hta文件。
但是,至less有一个缺点:浏览器无法打开.hta文件; 它是作为一个正常的.exe程序来处理的。 所以,如果你把一个.hta链接放到你的网页上,它会打开一个下载对话框,要求你打开或者保存HTA文件。 如果不是你的问题,你可以点击“打开”,它会打开一个新的窗口(没有工具栏,所以没有后退button,既不地址栏,也不是菜单栏)。
我需要做一些非常类似于你想要的东西,而不是iframes
,我用了一个真正的frameset
。
主页面需要是.hta文件; 另一个应该是一个正常的.htm页面(或.php或其他)。
下面是一个带2个框架的HTA页面的例子,其中顶部有一个button和一个文本字段,其中包含第二个框架URL; button更新字段:
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
标签,设置一些属性的文件; 有,但是这不是必须的。 - 您需要在“帧”标签处放置一个
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的元素都立即成为一个对象
我希望这可以帮助你,以及其他人能够解决这个问题。 它解决了我的问题,看起来像你一样。
你可以在这里find更多的信息: http : //www.irt.org/articles/js191/index.htm
享受=]
我喜欢你的服务器端的想法,即使我提出的实现它听起来有点贫民窟。
您可以将iframe的.innerHTML设置为您抓取服务器端的HTML内容。 根据你如何抓住这个,你将不得不注意相对与绝对path。
另外,根据您抓取的页面与其他页面的交互方式,这可能完全不起作用(cookie被设置为您抓取的页面不能跨域使用,也许状态正在使用Javascript进行跟踪…很多原因这可能无效。)
我不相信追踪你试图反映的页面的当前状态在理论上是可能的,但是我不确定。 该网站可以跟踪各种东西服务器端,你将无法访问这个状态。 想象一下,在一个页面加载一个variables被设置为一个随机值服务器端的情况下,你将如何捕获这个状态?
这些想法是否有助于任何事情?
-Brian J. Stinar-
我用这个
var iframe = parent.document.getElementById("theiframe"); var innerDoc = iframe.contentDocument || iframe.contentWindow.document; var currentFrame = innerDoc.location.href;
好的,所以在这个应用程序中,有一个iframe,其中用户提供了链接或一些容量,允许iframe浏览到某个外部网站。 然后您正在寻找捕获用户浏览的URL。
有一些事情要记住。 由于URL是一个外部来源,因此您可能会限制您通过javascript(或客户端访问)与此iframe进行交互的次数,这被称为浏览器跨域安全性,显然您已经发现。 这里有巧妙的解决方法,如这里介绍的跨域,跨框架的Javascript ,但我不认为这个工作适用于这种情况。
关于你可以访问的所有位置,只要你需要。
我会build议让代码更具有回复性,并且不易出错。 尝试浏览网页有时用IE或FFconfiguration显示JavaScript错误。 你会惊讶多lessjavascript错误抛出,主要是因为有很多错误的JavaScript在那里,只是继续激增。
这个解决scheme假定所讨论的iframe与运行javascript的“窗口”上下文相同。 (也就是说,它并不embedded到另一个框架或iframe中,在这种情况下,javascript代码会变得更加复杂,而且您可能需要recursionsearch窗口层次结构。)
<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>
希望这可以帮助。
你可以使用Ra-Ajax,并在内部包含一个iframe,例如一个Window控件。 虽然一般来说,我不鼓励人们使用iframe( 任何东西 )
另一种方法是将HTML加载到服务器上,并将其作为Label或其他内容直接发送到Window中。 看看这个Ajax RSSparsing器如何加载可以在这里下载的源代码中的RSS项目(开源 – LGPL)
(免责声明;我与Ra-Ajax合作…)
这有帮助吗?
http://www.quirksmode.org/js/iframe.html
我只testing了这个在Firefox中,但如果你有这样的东西:
<iframe name='myframe' id='myframe' src='http://www.google.com'></iframe>
您可以使用以下方式获取地址:
document.getElementById('myframe').src
不知道如果我正确地理解你的问题,但无论如何:)
你可以访问iframe的src属性,但只会给你最初加载的URL。 如果用户在iframe中浏览,则需要使用HTA来解决安全问题。
http://msdn.microsoft.com/en-us/library/ms536474(VS.85).aspx
查看链接,使用HTA并设置iframe的“application”属性将允许您访问document.href属性,并parsing出所需的所有信息,包括DOM元素及其值(如果您愿意的话)。
- 我如何使用global.asax中的Server.MapPath()?
- 解决“指定的string不是主题所需的格式”。
- 截断查询string&返回干净的URL C#ASP.net
- 无法成功启动或连接到MSBuild.exesubprocess。 validationMSBuild.exe
- AntiXss.HtmlEncode和HttpUtility.HtmlEncode有什么区别?
- Asp.net – 在下拉列表顶部添加空白项目
- 仅在本地主机上使用Fiddler
- 在asp.net mvc中火和忘记asynchronous方法
- ConfigurationManager.AppSettings 每次都从web.config文件中读取?