Erkennung von iFrame-src-Änderungsereignissen?

Lesezeit: 7 Minuten

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

Erkennung von iFrame src Anderungsereignissen
Daniel Wassallo

Vielleicht möchten Sie die verwenden onLoad Ereignis, wie im folgenden Beispiel:

<iframe src="http://www.google.com/" onLoad="alert('Test');"></iframe>

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:

<iframe src="https://stackoverflow.com/test.html" onLoad="alert(this.contentWindow.location);"></iframe>

  • Sie meinen this.contentWindow.location.href

    – Nicolai

    27. September 2011 um 13:50 Uhr

  • 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


Erkennung von iFrame src Anderungsereignissen
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 ');
});

https://jquery.com/upgrade-guide/3.0/#breaking-change-load-unload-and-error-removed

  • 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


Erkennung von iFrame src Anderungsereignissen
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

new MutationObserver(function(mutations) {
  mutations.some(function(mutation) {
    if (mutation.type === 'attributes' && mutation.attributeName === 'src') {
      console.log(mutation);
      console.log('Old src: ', mutation.oldValue);
      console.log('New src: ', mutation.target.src);
      return true;
    }

    return false;
  });
}).observe(document.body, {
  attributes: true,
  attributeFilter: ['src'],
  attributeOldValue: true,
  characterData: false,
  characterDataOldValue: false,
  childList: false,
  subtree: true
});

setTimeout(function() {
  document.getElementsByTagName('iframe')[0].src="http://jsfiddle.net/";
}, 3000);
<iframe src="http://www.google.com"></iframe>

Ausgabe nach 3 Sekunden

MutationRecord {oldValue: "http://www.google.com", attributeNamespace: null, attributeName: "src", nextSibling: null, previousSibling: null…}
Old src:  http://www.google.com
New src:  http://jsfiddle.net/ 

An jsFiddle

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

Erkennung von iFrame src Anderungsereignissen
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:

HTML Quelltext:

<iframe id="iframe" frameborder="0" scrolling="no" onload="resizeIframe(this)" width="100%" src="www.google.com"></iframe>

Js:

    function resizeIframe(obj) {
        alert(obj.contentWindow.location.pathname);
    }

1645906271 24 Erkennung von iFrame src Anderungsereignissen
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 ');
});

1645906272 675 Erkennung von iFrame src Anderungsereignissen
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:

;(function($) {
  Drupal.behaviors.commercePayPointIFrame = {
    attach: function (context, settings) {
      if (top.location != location) {
        $('html').hide();
        top.location.href = document.location.href;
      }
    }
  }
})(jQuery);

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

867750cookie-checkErkennung von iFrame-src-Änderungsereignissen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy