Angenommen, ich habe keine Kontrolle über den Inhalt im iframe, gibt es eine Möglichkeit, eine src-Änderung über die übergeordnete Seite zu erkennen? Vielleicht eine Art Onload?
Mein letzter Ausweg besteht darin, einen 1-Sekunden-Intervalltest durchzuführen, wenn der iframe src derselbe ist wie zuvor, aber diese hackige Lösung wäre scheiße.
Ich verwende die jQuery-Bibliothek, wenn es hilft.
Wird die src Eigenschaftsänderung, wenn auf einen Link im Iframe geklickt wird? Ich bin mir da nicht sicher – wenn ich raten müsste, würde ich “nein” sagen. Dort sind Möglichkeiten zur Überwachung von Eigenschaften (zumindest in Firefox AFAIK), aber ich bin mir nicht sicher, ob es in diesem Fall von Nutzen sein wird.
– Pekka
11. März 2010 um 22:10 Uhr
Ich versuche sowas umzusetzen und kann das bestätigen src -Attribut im DOM tut nicht Änderung in den neuesten Versionen von entweder Firefox oder Safari. @Michiels Antwort unten ist so gut, wie ich es bisher konnte.
– Kaelin Colclasure
15. September 2014 um 13:09 Uhr
Daniel Wassallo
Vielleicht möchten Sie die verwenden onLoad Ereignis, wie im folgenden Beispiel:
Die Warnung wird immer dann angezeigt, wenn sich die Position innerhalb des Iframes ändert. Es funktioniert in allen modernen Browsern, aber möglicherweise nicht in einigen sehr älteren Browsern wie IE5 und frühen Opera. (Quelle)
Wenn der Iframe eine Seite innerhalb derselben Domäne des übergeordneten Elements anzeigtkönnten Sie mit auf den Standort zugreifen contentWindow.locationwie im folgenden Beispiel:
Wenn ich es tue this.contentWindow.location.href Ich bekomme Permission denied to access property 'href'
– Mazatek
20. April 2012 um 10:13 Uhr
this.contentWindow.location.href funktioniert nicht, da Sie eine ursprungsübergreifende Anfrage stellen. 🙁 Alle Browser schränken das jetzt ein.
– Naveen
16. September 2014 um 7:58 Uhr
Korrektur: this.contentWindow.location ist für andere Domains verfügbar. Eben this.contentWindow.location.href ist für andere Domains verfügbar, aber nur zum Schreiben. Allerdings lesen this.contentWindow.location.href ist auf dieselbe Domäne beschränkt.
– Wadim
4. März 2015 um 11:17 Uhr
das ist nicht definiert Funktioniert nicht mehr.
– Hadnazzar
20. März 2020 um 15:44 Uhr
Michael
Antwort basierend auf JQuery < 3
$('#iframeid').load(function(){
alert('frame has (re)loaded');
});
Wie von subharb erwähnt, muss dies ab JQuery 3.0 geändert werden in:
$('#iframe').on('load', function() {
alert('frame has (re)loaded ');
});
Funktioniert nicht ganz wie geplant. Es löst die Warnung beim ersten Laden der Seite aus. Abhängig von Ihren Plänen für diesen Code (für mich animiere ich den Dialog von der Seite zum Absenden des Formulars) wird diese Lösung nicht funktionieren.
– standhaft
30. März 2015 um 23:17 Uhr
@stracigh, das ist richtig, das Ereignis wird jedes Mal ausgelöst, wenn der Frame geladen wird, also auch das erste Mal beim ersten Laden der Seite. Wenn Sie nicht möchten, dass Ihr Code beim ersten Mal ausgelöst wird, müssen Sie irgendwie erkennen, dass dies Ihr erster Frame ist, der geladen und zurückgegeben wird.
– Michael
31. März 2015 um 11:07 Uhr
@FooBar, Ja, es funktioniert domänenübergreifend, tatsächlich habe ich es dafür verwendet. Sie können jedoch nicht mit Javascript auf die Seite im iFrame zugreifen, wenn sich diese Seite auf einer anderen Domain befindet.
– Michael
3. April 2015 um 18:36 Uhr
Dies funktioniert und erkennt, wann der Inhalt geladen wird. Ich brauche eine Möglichkeit, um zu erkennen, wann sich der src ändert. So etwas wie beforeLoad (um einen Loader zu aktivieren)
– Andrea_86
20. Februar 2018 um 16:55 Uhr
Wie von @stacigh angegeben, wird das Ereignis einmal beim Laden der übergeordneten Seite ausgelöst. Wenn Sie einen Zähler außerhalb dieser Funktion deklarieren und ihn darin lesen, können Sie danach die Änderungen erkennen. Sie würden den Zähler innerhalb des Onload-Handlers plus have erhöhen if (counter > 1) { // do something on iframe actual change } (vorausgesetzt, der Zähler wurde beim Start auf 0 gesetzt)
– Alex
18. Oktober 2019 um 11:41 Uhr
Xotic750
Wenn Sie keine Kontrolle über die Seite haben und auf Änderungen achten möchten, sollten Sie die moderne Methode verwenden MutationObserver
Ein Beispiel für seine Verwendung, aufpassen src Attribut zur Änderung von an iframe
Die hier gepostete Antwort, da die ursprüngliche Frage als Duplikat dieser Frage geschlossen wurde.
Was ist, wenn ich Webkomponenten verwende und eine meiner benutzerdefinierten Komponenten ein src-Attribut hat? Ich denke, das würde versehentlich abholen.
– Lukas
19. Januar 2016 um 23:36 Uhr
Dann änderst du die Optionen weiter observe. Dies ist nur ein Beispiel.
– Xotic750
20. Januar 2016 um 0:55 Uhr
@PaulRoub entfernte den jsfiddle-Link (muss ein Fehler beim Kopieren/Einfügen gewesen sein) und fügte den Code als Snippet hinzu.
– Xotic750
10. April 2016 um 18:26 Uhr
Aber in meinem Fall ändert sich die frame.contentDocument.URL (von Links innerhalb des Frames), nicht die src. Kann ich mir das ansehen?
– httpete
22. September 2016 um 12:20 Uhr
Ich bin mir nicht sicher, am besten schreibe ich eine Frage, denke ich.
– Xotic750
22. September 2016 um 17:24 Uhr
dodov
Notiz: Das Snippet würde nur funktionieren, wenn der Iframe denselben Ursprung hat.
Andere Antworten schlugen vor load Ereignis, aber es feuert nach dem die neue Seite im Iframe wird geladen. Möglicherweise müssen Sie benachrichtigt werden unmittelbar nachdem sich die URL geändert hatnicht nachdem die neue Seite geladen wurde.
Hier ist eine einfache JavaScript-Lösung:
function iframeURLChange(iframe, callback) {
var unloadHandler = function () {
// Timeout needed because the URL changes immediately after
// the `unload` event is dispatched.
setTimeout(function () {
callback(iframe.contentWindow.location.href);
}, 0);
};
function attachUnload() {
// Remove the unloadHandler in case it was already attached.
// Otherwise, the change will be dispatched twice.
iframe.contentWindow.removeEventListener("unload", unloadHandler);
iframe.contentWindow.addEventListener("unload", unloadHandler);
}
iframe.addEventListener("load", attachUnload);
attachUnload();
}
iframeURLChange(document.getElementById("mainframe"), function (newURL) {
console.log("URL changed:", newURL);
});
<iframe id="mainframe" src=""></iframe>
Dadurch wird die erfolgreich verfolgt src Attributänderungen sowie alle URL-Änderungen, die innerhalb des Iframes selbst vorgenommen wurden.
Getestet in allen modernen Browsern.
Ich machte einen Kern auch mit diesem Code. Sie können auch meine andere Antwort überprüfen. Es geht ein wenig in die Tiefe, wie das funktioniert.
Der iframe behält immer die übergeordnete Seite bei, Sie sollten dies verwenden, um zu erkennen, auf welcher Seite Sie sich im iframe befinden:
function resizeIframe(obj) {
alert(obj.contentWindow.location.pathname);
}
subharb
Seit Version 3.0 von Jquery kann es zu einer Fehlermeldung kommen
TypeError: url.indexOf ist keine Funktion
Was sich leicht beheben lässt
$('#iframe').on('load', function() {
alert('frame has (re)loaded ');
});
kenorb
Hier ist die Methode, die in verwendet wird Handel SagePay und in Commerce Paypoint Drupal-Module, die im Grunde verglichen werden document.location.href mit dem alten Wert, indem zuerst ein eigenes Iframe geladen wird, dann ein externes.
Die Idee ist also im Grunde, die leere Seite als Platzhalter mit eigenem JS-Code und verstecktem Formular zu laden. Dann wird der übergeordnete JS-Code dieses versteckte Formular dort einreichen, wo es ist #action zeigt auf den externen iframe. Sobald die Umleitung/Übermittlung erfolgt ist, kann der JS-Code, der noch auf dieser Seite ausgeführt wird, Ihre nachverfolgen document.location.href Wert ändert.
Hier ist ein Beispiel für JS, das in iframe verwendet wird:
Und hier ist JS, das auf der übergeordneten Seite verwendet wird:
;(function($) {
/**
* Automatically submit the hidden form that points to the iframe.
*/
Drupal.behaviors.commercePayPoint = {
attach: function (context, settings) {
$('div.payment-redirect-form form', context).submit();
$('div.payment-redirect-form #edit-submit', context).hide();
$('div.payment-redirect-form .checkout-help', context).hide();
}
}
})(jQuery);
Dann müssen Sie auf der temporären leeren Zielseite das Formular einfügen, das auf die externe Seite umleitet.
Dies mag ein Hack sein, aber der Aufwand ist erheblich geringer als bei Mutation Observer. Achten Sie bei der Verwendung in einer Single-Page-Anwendung darauf, keine Verweise zu erstellen, die verhindern, dass die Reste dieses Hacks von der Garbage Collection erfasst werden.
– Jeff
1. April 2016 um 19:15 Uhr
8677500cookie-checkErkennung von iFrame-src-Änderungsereignissen?yes
Wird die
src
Eigenschaftsänderung, wenn auf einen Link im Iframe geklickt wird? Ich bin mir da nicht sicher – wenn ich raten müsste, würde ich “nein” sagen. Dort sind Möglichkeiten zur Überwachung von Eigenschaften (zumindest in Firefox AFAIK), aber ich bin mir nicht sicher, ob es in diesem Fall von Nutzen sein wird.– Pekka
11. März 2010 um 22:10 Uhr
Ich versuche sowas umzusetzen und kann das bestätigen
src
-Attribut im DOM tut nicht Änderung in den neuesten Versionen von entweder Firefox oder Safari. @Michiels Antwort unten ist so gut, wie ich es bisher konnte.– Kaelin Colclasure
15. September 2014 um 13:09 Uhr