Hoe krijg ik de huidige locatie van een iframe?

Ik heb een basistoepassing voor gegevensinvoer gebouwd waarmee gebruikers door externe inhoud in iframe kunnen bladeren en snel gegevens vanaf dezelfde pagina kunnen invoeren. Een van de gegevensvariabelen is de URL.
In het ideale geval zou ik de huidige url van iframes in een tekstvak met javascript willen kunnen laden. Ik realiseer me nu dat dit niet gaat gebeuren vanwege beveiligingsproblemen.

Heeft iemand iets aan de serverkant gedaan? of ken een .Net-browser in browserbesturingselementen. Het uiteindelijke doel is om de gebruiker een eenvoudige methode te geven om de url te extraheren van de pagina die ze in het iframe bekijken. Het hoeft niet per se een iframe te zijn, een browser in de browser zou ideaal zijn.

Bedankt,
Adam


Antwoord 1, autoriteit 100%

Ik heb wat tests gedaan in Firefox 3, waarbij ik de waarde van .srcen .documentWindow.location.hrefheb vergeleken in een iframe. (Opmerking: het documentWindowheet contentDocumentin Chrome, dus in plaats van .documentWindow.location.hrefin Chrome wordt het .contentDocument.location.href.)

srcis altijd de laatste URL die zonder gebruikersinteractie in het iframe is geladen. Dat wil zeggen, het bevat de eerste waarde voor de URL, of de laatste waarde die u hebt ingesteld met Javascript vanuit het venster dat het bevat:

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

Als de gebruiker binnen het iframe navigeert, heb je geen toegang meer tot de waarde van de URL met src. In het vorige voorbeeld, als de gebruiker www.google.com verlaat en u doet:

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

U krijgt nog steeds “http://www.google.com“.

documentWindow.location.hrefis alleen beschikbaar als het iframe een pagina bevat in hetzelfde domein als het bevattende venster, maar als het beschikbaar is, bevat het altijd de juiste waarde voor de URL, zelfs als de gebruiker navigeert in het iframe.

Als u probeert toegang te krijgen tot documentWindow.location.href(of iets onder documentWindow) en het iframe staat op een pagina die niet tot het domein van de venster bevat, wordt er een uitzondering gemaakt:

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

Ik heb geen andere browser getest.

Hopelijk helpt het!


Antwoord 2, autoriteit 45%

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

U heeft helemaal geen toegang tot iframe-locaties tussen domeinen.


Antwoord 3, autoriteit 4%

Ik gebruik dit.

var iframe = parent.document.getElementById("theiframe");
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var currentFrame = innerDoc.location.href;

Antwoord 4, autoriteit 2%

HTA werkt als een normale Windows-toepassing.
U schrijft HTML-code en slaat deze op als een .hta-bestand.

Er is echter in ieder geval één nadeel: de browser kan geen .hta-bestand openen; het wordt behandeld als een normaal .exe-programma. Dus als u een link naar een .hta-bestand op uw webpagina plaatst, wordt een downloaddialoogvenster geopend waarin u wordt gevraagd het HTA-bestand te openen of op te slaan. Als het geen probleem voor je is, kun je op “Openen” klikken en er wordt een nieuw venster geopend (zonder werkbalken, dus geen knop Terug, geen adresbalk of menubalk).

Ik moest iets doen dat erg lijkt op wat jij wilt, maar in plaats van iframesgebruikte ik een echte frameset.
De hoofdpagina moet een .hta-bestand zijn; de andere moet een normale .htm-pagina zijn (of .php of wat dan ook).

Hier is een voorbeeld van een HTA-pagina met 2 frames, waarbij de bovenste een knop en een tekstveld heeft, dat de tweede frame-URL bevat; de knop werkt het veld bij:

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="https://www.google.com" name="conteudo" id="conteudo" application="yes" />
    </frameset>
</html>
  • Er is een HTA:APPLICATION-tag die enkele eigenschappen voor het bestand instelt; het is goed om te hebben, maar het is geen must.
  • U MOETeen application="yes"plaatsen bij de tags van de frames. Er staat dat ze ook bij het programma horen en toegang moeten hebben tot alle gegevens (als je dat niet doet, zullen de frames nog steeds de fout weergeven die je eerder had).

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>
  • Je zou moeten opmerken dat ik geen enkele getElement-functie heb gebruikt om het veld op te halen; in een HTA-bestand worden alle elementen met een ID onmiddellijk een object

Ik hoop dat dit jou en anderen helpt die deze vraag beantwoorden. Het loste mijn probleem op, dat lijkt hetzelfde te zijn als jij hebt.

U kunt hier meer informatie vinden: http://www.irt.org/articles/js191 /index.htm

Veel plezier =]


Antwoord 5, autoriteit 2%

Ik hou van je serverside-idee, ook al klinkt mijn voorgestelde implementatie ervan een beetje getto.

Je zou de .innerHTML van het iframe kunnen instellen op de HTML-inhoud die je aan de serverkant pakt. Afhankelijk van hoe je dit grijpt, zul je moeten letten op relatieve versus absolute paden.

Bovendien kan dit, afhankelijk van hoe de pagina die u ophaalt, interageert met andere pagina’s, totaal niet werken (cookies die worden ingesteld voor de pagina die u oppikt, werken niet in alle domeinen, misschien wordt de status bijgehouden in Javascript… Veel redenen waarom dit misschien niet werkt.)

Ik geloof niet dat het theoretisch mogelijk is om de huidige staat van de pagina die je probeert te spiegelen bij te houden, maar ik weet het niet zeker. De site kan allerlei dingen aan de serverzijde volgen, u hebt geen toegang tot deze status. Stel je het geval voor waarbij bij het laden van een pagina een variabele wordt ingesteld op een willekeurige waarde aan de serverzijde, hoe zou je deze status vastleggen?

Helpen deze ideeën ergens mee?

-Brian J. Stinar-


Antwoord 6

Je kunt Ra-Ajaxgebruiken en een iframe erin hebben, b.v. een raambediening. Hoewel ik mensen in het algemeen niet aanmoedig om iframes te gebruiken (voor alles)

Een ander alternatief is om de HTML op de server te laden en deze rechtstreeks naar het venster te sturen als de inhoud van een label of zoiets. Bekijk hoe deze Ajax RSS-parserde RSS-items laadt in de broncode die hier(Open Source – LGPL)

(Disclaimer; ik werk met Ra-Ajax…)


7

U hebt toegang tot de SRC-eigenschap van de IFRAME, maar die u alleen de aanvankelijk geladen URL geeft. Als de gebruiker in de IFRAME VIA VIER NAVIGINGEN, moet u een HTA gebruiken om het beveiligingsprobleem op te lossen.

http://msdn.microsoft.com/ EN-VS / Bibliotheek / MS536474 (Vs.85) .aspx

Bekijk de link, met behulp van een HTA en het instellen van de eigenschap “Applicatie” van een IFRAME waarmee u toegang hebt tot de eigenschap Document.href en alle informatie die u wilt, inclusief DOM-elementen en hun waarden als u dat wilt, kunt u dat toelaten kies.

Other episodes