簡體   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