2009-05-04 7 views
53

Ich ändere ein IFRAME src, um es neu zu laden, funktioniert es gut und feuern das Ereignis onload, wenn sein HTML geladen wird.Erneutes Laden eines IFRAME ohne Hinzufügen des Verlaufs

Aber es fügt einen Eintrag in die Geschichte, die ich nicht will. Gibt es eine Möglichkeit, einen IFRAME erneut zu laden und den Verlauf nicht zu beeinflussen?

+5

ich das Problem bin zu raten, ist die Zurück-Taste Durchläuft den Iframe, bevor Sie die vorherige Seite aufrufen. –

+1

Was auch immer es tut, möchte ich keine Ergänzungen der Geschichte, oder gibt es eine Möglichkeit, dass ich den neuesten Verlauf Eintrag löschen kann ?? –

Antwort

27

können Sie Javascript verwenden location.replace:

window.location.replace('...html'); 

Ersetzen Sie das aktuelle Dokument mit dem eine an der angegebenen URL. Die Differenz aus dem assign() Methode ist , dass nach ersetzen() verwendet die aktuelle Seite wird nicht in der Sitzung Geschichte gespeichert werden, wird der Benutzer bedeutet nicht können sie auf die Schaltfläche Zurück zu navigieren verwenden.

+2

Würde dies die Seite selbst anvisieren? Ich möchte nur das IFRAME neu laden und ich habe keine Kontrolle über die Skripte, die im geladenen Dokument laufen. –

+5

Ersetze einfach "window" mit einem Verweis auf deinen iframe. – Ishmael

+0

Es ist nicht so einfach! –

17

Wie Greg oben sagte, ist die .replace() -Funktion, wie dies zu tun ist. Ich kann nicht herausfinden, wie ich auf seine Antwort * antworten soll, aber der Trick ist, auf die iFrames contentWindow-Eigenschaft zu verweisen.

var ifr = document.getElementById("iframeId"); 
ifr.contentWindow.location.replace("newLocation.html"); 

* Gerade gelernt, ich brauche mehr Ruf, um eine Antwort zu kommentieren.

60

Verwendung von replace() ist nur eine Option mit Ihren eigenen Domain-Iframes. Es funktioniert nicht auf entfernten Seiten (zB: eine Twitter-Schaltfläche) und erfordert einige browserspezifische Kenntnisse, um zuverlässig auf das untergeordnete Fenster zuzugreifen.

Stattdessen entfernen Sie einfach das Iframe-Element und konstruieren Sie ein neues an der gleichen Stelle. Verlaufselemente werden nur erstellt, wenn Sie das Attribut src ändern, nachdem es sich im DOM befindet. Stellen Sie daher sicher, dass es vor dem Anhängen gesetzt wird.

Bearbeiten: JDandChips erwähnt zu Recht, dass Sie aus DOM entfernen, ändern und neu anhängen können. Der Aufbau von frischem ist nicht erforderlich.

+4

Während diese Antwort 2 Jahre neuer als die akzeptierten Antwort, ist es der richtige Weg, ohne eine Iframe-URL/src zu ändern Geschichte des Browsers hinzufügen. Jede andere Kombination von window.frames [framename] .location und/oder history.replaceState wird in einem Iframe aus Sicherheitsgründen nicht. Sogar auf der gleichen Domain (wie ich gerade herausgefunden habe). –

+0

Dies ist die beste funktionierende Antwort, die ich versucht habe. Löste mein Problem. – pppglowacki

+0

Die Lösung war diese! Ich musste den iframe erstellen, damit die Geschichte intakt bleibt. – roq

5

Versuchen Sie, diese Funktion zu nutzen, um alte iframe mit neuen iframe zu ersetzen, die aus alten kopiert wird:

function setIFrameSrc(idFrame, url) { 
    var originalFrame = document.getElementById(idFrame); 
    var newFrame = document.createElement("iframe"); 
    newFrame.id = originalFrame.getAttribute("id"); 
    newFrame.width = originalFrame.getAttribute("width"); 
    newFrame.height = originalFrame.getAttribute("height"); 
    newFrame.src = url;  
    var parent = originalFrame.parentNode; 
    parent.replaceChild(newFrame, originalFrame); 
} 

es wie folgt verwendet:

setIFrameSrc("idframe", "test.html"); 

Auf diese Weise wird nicht hinzufügen URL iframe zur Browserhistorie.

+1

Das ist praktisch. Vielen Dank! –

+1

Schön, funktioniert gut auf Chrome und Safari. – Amoss

11

Eine alternative Methode zum erneuten Erstellen des Iframe wäre, den iframe aus dem DOM zu entfernen, den src zu ändern und ihn dann erneut hinzuzufügen.

In vielerlei Hinsicht ist dies ähnlich der replace() Vorschlag, aber ich hatte einige Probleme, wenn ich diesen Ansatz mit History.js versuchte und Staaten manuell verwalten.

var container = iframe.parent(); 

iframe.remove(); 
iframe.attr('src', 'about:blank'); 

container.append(iframe); 
+0

ich wirklich so: es stellte sich so leichter erwiesen, als einen neuen iframe erstellen, da brauchen Sie nicht zu kopieren über alle Eigenschaften der neuen iframe (id, Größe, Stil Klassen, ...) – Legolas

+0

gespeichert. MEINE. LEBEN. danke eine Million ... – gcoladarci

7

Eine Lösung ist die object Tag eher als die iframe Tag zu verwenden.

das Ersetzen:

<iframe src="http://yourpage"/> 

Durch diese:

<object type="text/html" data="http://yourpage"/> 

können Sie das data Attribut aktualisieren, ohne die Geschichte zu beeinflussen. Dies ist nützlich, wenn Sie ein deklaratives Framework wie React.js verwenden, in dem Sie keinen imperativen Befehl ausführen müssen, um das DOM zu aktualisieren.

Weitere Details über die Unterschiede zwischen iframe und object: Use of Iframe or Object tag to embed web pages in another

+0

!!! Beste Antwort !!! – xiefei

+0

Vereinbarte große Antwort @JBE dies half mir enorm mit Angular2 und nicht die iframe src mit Änderungen Geschichte Updates auslösen. –

+0

Dies funktioniert nicht für mich. Ich bin in Chrome. Selbst das Zerstören des iFrame und das Ersetzen durch ein Objekt verursacht immer noch den veralteten Status des Browser-Verlaufs (was keinen Sinn ergibt, da das zerstörte Objekt niemals seinen Inhalt zurückbekommt). Grrrrrrrrr. – trusktr

0

Die einfachste und schnelle Lade Lösung
Verwenden window.location.replace nicht die Geschichte zu aktualisieren, wenn die Seite oder den Rahmen zu laden.

Für Links sieht es wie folgt aus:

<a href="#" onclick="YourTarget.location.replace ('http://www.YourPage.com');"> 
The targeted Link</a> 

oder

<a href="javascript:YourTarget.location.replace ('http://www.YourPage.com');"> 
The targeted Link</a> 



Aber, wenn Sie wollen, dass es nicht von Link zu handeln, sondern automatisch zu handeln, wenn der Rahmen geladen dann aus dem iframe sollten Sie dies in den Iframe-Datei-Body-Abschnitt:

onload="window.location.replace ('http://www.YourPage.com');" 


aus irgendeinem Grund Wenn die onload nicht geladen in iframe dann Ihr Ziel Frame-Namen in der Syntax wie folgt statt Fenster setzen:

onload="YourTarget.location.replace ('http://www.YourPage.com');" 



HINWEIS : Für dieses Skript alle onclick, onmouseover, onmouseout, onload und href="javascript:" wird funktionieren.

0

die replace Methode Verwenden Sie die Zugabe des iframe der URL Geschichte zu umgehen:

HTML:

<iframe id="myIframe" width="100%" height="400" src="#"></iframe> 

JavaScript:

var ifr = document.getElementById('mIframe') 
if (ifr) { 
    ifr.contentWindow.location.replace('http://www.blabla.com') 
} 
Verwandte Themen