Laden Sie einen Iframe mit jQuery neu

150

Ich habe zwei Iframes auf einer Seite und einer nimmt Änderungen am anderen vor, aber der andere Iframe zeigt die Änderung erst an, wenn ich sie aktualisiere. Gibt es eine einfache Möglichkeit, diesen Iframe mit jQuery zu aktualisieren?

<div class="project">
  <iframe id="currentElement" class="myframe" name="myframe" src="http://somesite.com/something/new"></iframe>
</div>
Matt Elhotiby
quelle
3
Befindet sich das Iframe-Dokument in einer anderen Domäne?
Pekka
Haben Sie Zugriff auf den Code der Site, der im iFrame angezeigt wird?
Matt Asbury
Mehr Code anzeigen - das HTML für beide iFrames sowie den Javascript-Code, mit dem Sie die Änderungen vornehmen. Es ist schwer herauszufinden, was das Problem ist, wenn man nur das sieht, was man bisher aufgenommen hat.
Ben Lee
Ich habe Zugriff auf den Code Ja und der Iframe befindet sich in einer anderen Domain
Matt Elhotiby
@Matt, Frames dürfen keine Änderungen am Inhalt von Frames in anderen Domänen vornehmen. Beispiele zur Umgehung dieser domänenübergreifenden Skriptbeschränkung finden Sie unter: softwareas.com/cross-domain-communication-with-iframes
Ben Lee

Antworten:

174

Wenn sich der Iframe nicht in einer anderen Domain befindet, können Sie Folgendes tun:

document.getElementById(FrameID).contentDocument.location.reload(true);

Da sich der Iframe jedoch in einer anderen Domäne befindet, wird Ihnen contentDocumentdurch die Richtlinie mit demselben Ursprung der Zugriff auf die Eigenschaft des Iframes verweigert .

Sie können den domänenübergreifenden Iframe jedoch hackig zum erneuten Laden zwingen, wenn Ihr Code auf der übergeordneten Seite des Iframes ausgeführt wird, indem Sie das src-Attribut auf sich selbst setzen. So was:

// hackishly force iframe to reload
var iframe = document.getElementById(FrameId);
iframe.src = iframe.src;

Wenn Sie versuchen, den Iframe von einem anderen Iframe neu zu laden, haben Sie kein Glück, das ist nicht möglich.

Alex
quelle
19
Seine Frage war, wie dies mit jQuery erreicht werden kann - nicht mit Javascript. Die richtige Antwort auf jQuery finden Sie im Beitrag von Sime Vidas unten.
FastTrack
2
Das Skript hat nicht funktioniert in meinem IE9 (nicht andere Version überprüfen). Ändern contentdocument zu contentWindow macht es auf IE9 arbeiten. document.getElementById(FrameID).contentWindow.location.reload(true);
Han He
3
Das hat bei mir nicht funktioniert, aber ich habe iframe.contentDocument.location=iframe.src; stattdessen so etwas gemacht, was großartig funktioniert hat
Glitchyme
3
Diese Jquery wirkte wie ein Zauber für mich:$('#map_iframe').attr('src', $('#map_iframe').attr('src'));
Topher Hunt
234
$( '#iframe' ).attr( 'src', function ( i, val ) { return val; });
Šime Vidas
quelle
2
+1 für nur einen Verweis auf die ID, weniger wahrscheinlich, einen zu ändern, aber den anderen zu vergessen
Matthew Lock
1
@NicolaeSurdu Auch dies:(function (elem) { elem.src = elem.src; }($('#iframe')[0]));
Šime Vidas
1
Um einen Iframe aus dem anderen neu zu laden, ändern Sie ihn in: $ ('# iframe', window.parent.document) .attr ('src', Funktion (i, val) {return val;});
Tillito
In Internet Explorer document.getElementById(FrameID).contentWindow.location.reload(true);funktionieren Javascript-Lösungen wie nicht richtig. Diese Antwort funktioniert besser.
BeyazKaplan
54

Sie können auch jquery verwenden. Dies ist das gleiche, was Alex vorgeschlagen hat, nur mit JQuery:

 $('#currentElement').attr("src", $('#currentElement').attr("src"));
ynh
quelle
3
Der Vorteil dieser Lösung ist die Lesbarkeit. Obwohl es nicht so effizient ist wie die Antwort von Vidas, ist es offensichtlich, was passiert.
Robert Egginton
Ich stimme zu, ich bevorzuge auch die Lesbarkeit dieser Lösung
Yonatan Naor
var f = $('#iframeX') ; f.attr( 'src', f.attr( 'src' ))kann robuster zu pflegen und zu lesen sein
Andreas Dietrich
9

Laden Sie einen Iframe mit jQuery neu

Machen Sie einen Link innerhalb des Iframes, sagen wir mit id = "reload", und verwenden Sie dann den folgenden Code

$('#reload').click(function() {
    document.location.reload();
});

und Sie können mit allen Browsern arbeiten.

Laden Sie einen Iframe mit HTML neu (keine Java Script-Anforderung).

Es hat eine einfachere Lösung: die funktioniert ohne JavaScript in (FF, Webkit)

Machen Sie einfach einen Anker inSide Ihrem Iframe

   <a href="#" target="_SELF">Refresh Comments</a>

Wenn Sie auf diesen Anker klicken, wird nur Ihr Iframe aktualisiert

Aber wenn Sie den Parameter send zu Ihrem iframe haben es dann tun , wie folgend.

  <a id="comnt-limit" href="?id=<?= $page_id?>" target="_SELF">Refresh Comments</a>

brauche keine Seiten-URL, weil -> target = "_ SELF" es für dich tut


quelle
9

Mit jquery können Sie Folgendes verwenden:

$('#iframeid',window.parent.document).attr('src',$('#iframeid',window.parent.document).attr('src'));
elin3t
quelle
Diese Lösung, wenn Sie den aktuellen Iframe aktualisieren möchten, wo wir uns befinden. Vielen Dank!
DaemonHK
5

Ich erwidere nur Alex 'Antwort, aber mit jQuery

var currSrc = $("#currentElement").attr("src");
$("#currentElement").attr("src", currSrc);
Matt Asbury
quelle
4

Hier ist ein anderer Weg

$( '#iframe' ).attr( 'src', function () { return $( this )[0].src; } );
Nasir Mahmood
quelle
1
$( '#iframe' ).attr('src', $( '#iframe' ).attr('src'));
Zanderwar
3

Ich bin mir ziemlich sicher, dass alle obigen Beispiele den Iframe nur mit seiner ursprünglichen src neu laden, nicht mit seiner aktuellen URL.

$('#frameId').attr('src', function () { return $(this).contents().get(0).location.href });

Das sollte mit der aktuellen URL neu geladen werden.

Kennzeichen
quelle
2

Wenn Sie domänenübergreifend sind, wird durch einfaches Zurücksetzen des src auf dieselbe URL nicht immer ein erneutes Laden ausgelöst, selbst wenn sich der Speicherort-Hash ändert.

Dieses Problem ist beim manuellen Erstellen von Twitter-Schaltflächen-Iframes aufgetreten, die beim Aktualisieren der URLs nicht aktualisiert wurden.

Twitter-ähnliche Schaltflächen haben die Form: .../tweet_button.html#&_version=2&count=none&etc=...

Da Twitter das Dokumentfragment für die URL verwendet, wurde beim Ändern des Hash / Fragments die Quelle nicht neu geladen, und die Schaltflächenziele spiegelten nicht meinen neuen, von Ajax geladenen Inhalt wider.

Sie können einen Abfragezeichenfolgenparameter anhängen, um das Neuladen zu erzwingen (z. "?_=" + Math.random() Dies verschwendet jedoch Bandbreite, insbesondere in diesem Beispiel, in dem der Ansatz von Twitter speziell versucht hat, das Caching zu aktivieren.

Um etwas neu zu laden, das sich nur mit Hash-Tags ändert, müssen Sie das Element entfernen oder das ändern src, warten, bis der Thread beendet ist, und ihn dann wieder zuweisen. Wenn die Seite noch zwischengespeichert ist, sollte dies keinen Netzwerktreffer erfordern, löst jedoch das erneute Laden des Frames aus.

 var old = iframe.src;
 iframe.src = '';
 setTimeout( function () {
    iframe.src = old;
 }, 0);

Update : Mit diesem Ansatz werden unerwünschte Verlaufselemente erstellt. Entfernen Sie stattdessen jedes Mal das iframe-Element und erstellen Sie es neu, damit diese Schaltfläche back () wie erwartet funktioniert. Auch schön, den Timer nicht zu haben.

greg.kindel
quelle
2

Ich erwidere nur Alex 'Antwort, aber mit jQuery:

var e = $('#myFrame');
    e.attr("src", e.attr("src"));

Oder Sie können eine kleine Funktion verwenden:

function iframeRefresh(e) {
    var c = $(e);
        c.attr("src", c.attr("src"));
}

Ich hoffe, es hilft.

Akm16
quelle
2
$('IFRAME#currentElement').get(0).contentDocument.location.reload()
Pavel
quelle
hat in waterfox 2019.10 nicht funktioniert
Andreas Dietrich
1

Dies ist mit einfachem JavaScript möglich.

  • Erstellen Sie in iFrame1 eine JavaScript-Funktion, die im Body-Tag onload aufgerufen wird. Ich habe eine serverseitige Variable überprüft, die ich festgelegt habe, daher wird nicht versucht, die JavaScript-Funktion in iframe2 auszuführen, es sei denn, ich habe in iframe1 eine bestimmte Aktion ausgeführt. Sie können dies als eine Funktion einrichten, die per Knopfdruck ausgelöst wird, oder wie Sie möchten, in iframe1.
  • Dann haben Sie in iframe2 die zweite Funktion, die ich unten aufführe. Die Funktion in iframe1 wechselt grundsätzlich zur übergeordneten Seite und verwendet dann die window.framesSyntax, um eine JavaScript-Funktion in iframe2 auszulösen. Stellen Sie einfach sicher, dass Sie das id/ namevon iframe2 und nicht das verwenden src.
//function in iframe1
function refreshIframe2()
{
    if (<cfoutput>#didValidation#</cfoutput> == 1)
    {   
         parent.window.frames.iframe2.refreshPage();
    }
}

//function in iframe2
function refreshPage()
{   
    document.location.reload();
}
Keith Pastorek
quelle
1

// aktualisiere alle iframes auf der Seite

var f_list = document.getElementsByTagName('iframe');

 for (var i = 0, f; f = f_list[i]; i++) {
                            f.src = f.src;
                        }
wesley7
quelle
0
    ifrX =document.getElementById('id') //or 
    ifrX =frames['index'];

Die browserübergreifende Lösung lautet:

    ifrX.src = ifrX.contentWindow.location

Dies ist besonders nützlich, wenn <iframe> das Ziel eines <form> ist

Bortunac
quelle
warum jQuery ?! wenn einfach js verfügbar
Bortunac
0

Gelöst! Ich registriere mich bei stockoverflow, um Ihnen die einzige Lösung (zumindest in ASP.NET/IE/FF/Chrome) mitzuteilen, die funktioniert! Die Idee ist, den innerHTML-Wert eines div durch seinen aktuellen innerHTML-Wert zu ersetzen.

Hier ist das HTML-Snippet:

<div class="content-2" id="divGranite">
<h2>Granite Purchase</h2>
<IFRAME  runat="server" id="frameGranite" src="Jobs-granite.aspx" width="820px" height="300px" frameborder="0" seamless  ></IFRAME>
</div>

Und mein Javascript-Code:

function refreshGranite() {           
   var iframe = document.getElementById('divGranite')
   iframe.innerHTML = iframe.innerHTML;
}

Hoffe das hilft.

hubert17
quelle
Mehrere Fehler in dieser Antwort: 1. Keine ASP.NET-Komponente, daher runat="server"nicht anwendbar. 2. Warum alle Kappen für IFRAME? 3. Dimensionsattributwerte haben keine Einheiten. 4. frameborderist veraltet
Raptor
0

Sie müssen verwenden

[0] .src

Um die Quelle des Iframes und seine URL zu finden, muss er sich in derselben Domäne des übergeordneten Elements befinden.

setInterval(refreshMe, 5000);
function refreshMe() {
    $("#currentElement")[0].src = $("#currentElement")[0].src;   
}
Mau
quelle
0

Sie können es so machen

$('.refrech-iframe').click(function(){
        $(".myiframe").attr("src", function(index, attr){ 
            return attr;
        });
    });
aitbella
quelle
-5

Die folgende Lösung wird sicher funktionieren:

window.parent.location.href = window.parent.location.href;
Mamta
quelle