jQuery – Löst ein Ereignis aus, wenn ein Element aus dem DOM entfernt wird

Lesezeit: 8 Minuten

jQuery – Lost ein Ereignis aus wenn ein Element aus
sa125

Ich versuche herauszufinden, wie man einen js-Code ausführt, wenn ein Element von der Seite entfernt wird:

jQuery('#some-element').remove(); // remove some element from the page
/* need to figure out how to independently detect the above happened */

Gibt es eine Veranstaltung, die darauf zugeschnitten ist, so etwas wie:

jQuery('#some-element').onremoval( function() {
    // do post-mortem stuff here
});

  • Aus Neugier, was würde mit dem entfernten Element geschehen wollen?

    – Natrium

    4. Februar 10 um 14:52 Uhr

  • Ich habe ein Element, das sich selbstständig an das von mir entfernte Teil anheftet, also möchte ich erkennen, wann dieses Teil weg ist, um dieses Element ebenfalls zu eliminieren. Ich könnte das Ganze neu entwerfen, aber wenn ich das oben Gesagte bewerkstellige, spare ich viel Zeit (und Code).

    – sa125

    7. Februar 10 um 7:06 Uhr

jQuery – Lost ein Ereignis aus wenn ein Element aus
mtkopone

Sie können verwenden jQuery-Sonderereignisse dafür.

In aller Einfachheit,

Konfiguration:

(function($){
  $.event.special.destroyed = {
    remove: function(o) {
      if (o.handler) {
        o.handler()
      }
    }
  }
})(jQuery)

Verwendung:

$('.thing').bind('destroyed', function() {
  // do stuff
})

Nachtrag zur Beantwortung der Kommentare von Pierre und DesignerGuy:

Damit der Rückruf beim Anrufen nicht ausgelöst wird $('.thing').off('destroyed')ändern Sie die if-Bedingung in: if (o.handler && o.type !== 'destroyed') { ... }

  • Wirklich schöne Lösung. Ben Alman hat einen schönen Bericht über besondere Ereignisse für weitere Informationen: benalman.com/news/2010/03/jquery-special-events

    – antti_s

    16. April 12 um 10:52 Uhr

  • +1 hatte es bisher geschafft, diese besonderen Ereignisse völlig zu verpassen, verdammt nützlich! Eine Sache zu sagen, nachdem Sie das oben Genannte gerade implementiert haben, wäre es am besten, es zu ändern o.handler() zu o.handler.apply(this,arguments) Andernfalls werden die Ereignis- und Datenobjekte nicht durch den Ereignis-Listener geleitet.

    – Kiesel

    7. November 12 um 22:03 Uhr

  • Dies funktioniert jedoch nicht, wenn Sie Elemente ohne jQuery entfernen.

    – djjek

    29. Dezember 12 um 0:06 Uhr

  • Dies funktioniert nicht a) wenn Elemente getrennt statt entfernt werden oder b) wenn einige alte Nicht-Jquery-Bibliotheken innerHTML verwenden, um Ihre Elemente zu zerstören (ähnlich wie djjeck sagte).

    – Charon ICH

    16. Januar 13 um 14:32 Uhr

  • Passen Sie auf, dass der Handler gerufen wird, wenn Sie $('.thing').unbind('destroyed') was wirklich ärgerlich sein könnte (da unbind bedeutet, dass wir nicht wollen, dass der Handler aufgerufen wird …)

    –Pierre

    17. Januar 13 um 17:19 Uhr

1644313389 818 jQuery – Lost ein Ereignis aus wenn ein Element aus
Philipp Munin

Gerade überprüft, es ist bereits in der aktuellen Version von JQuery integriert:

jQuery – v1.9.1

jQuery-Benutzeroberfläche – v1.10.2

$("#myDiv").on("remove", function () {
    alert("Element was removed");
})

Wichtig: Dies ist die Funktionalität von Jquery-Benutzeroberfläche Skript (nicht JQuery), also müssen Sie beide Skripte (jquery und jquery-ui) laden, damit es funktioniert. Hier ist ein Beispiel: http://jsfiddle.net/72RTz/

  • Das war sehr hilfreich. Ich habe erfahren, dass sich diese Funktionalität in der „Widget“-Komponente der jQuery-Benutzeroberfläche befindet, wenn Sie nicht die gesamte UI-Bibliothek herunterladen möchten.

    – Neil

    10. Mai 13 um 16:47 Uhr

  • Ist das irgendwo dokumentiert? Ich habe gerade die jQuery-UI-Widget-Dokumentation durchgesehen und konnte keine Erwähnung davon finden. Würde gerne sehen, ob dies offiziell unterstützt wird / irgendwelche Vorbehalte bei der Verwendung …

    – Josch

    1. August 2013 um 17:00 Uhr

  • Dieser funktioniert nicht – versucht in jQuery 1.10.2, aber die Antwort unten von @mtkopone funktioniert perfekt, daher würde ich für die Aktualisierung der Antwort in dieser Frage stimmen

    – Marcin

    19. Oktober 13 um 7:57 Uhr

  • Dieser funktioniert nur teilweise. Wenn Sie tun remove auf dem Element wird es ausgelöst, aber wenn das Element auf andere Weise zerstört wird, indem es beispielsweise überschrieben wird, funktioniert es nicht.

    – Carl Smith

    22. Oktober 13 um 16:38 Uhr

  • Sie könnten Recht haben, wahrscheinlich gibt es einen anderen Ereignisnamen für diesen Fall. Es wäre großartig, wenn Sie ein jsfiddle-Beispiel für Ihren Fall bereitstellen könnten.

    – Philipp Munin

    22. Oktober 13 um 16:41 Uhr

Sie können an das DOMNodeRemoved-Ereignis binden (Teil der DOM Level 3 WC3-Spezifikation).

Funktioniert in IE9, den neuesten Versionen von Firefox und Chrome.

Beispiel:

$(document).bind("DOMNodeRemoved", function(e)
{
    alert("Removed: " + e.target.nodeName);
});

Sie können auch eine Benachrichtigung erhalten, wenn Elemente eingefügt werden, indem Sie an binden DOMNodeInserted

  • Hinweis: “Das Hinzufügen von DOM-Mutations-Listenern zu einem Dokument verschlechtert die Leistung weiterer DOM-Änderungen an diesem Dokument erheblich (was sie 1,5- bis 7-mal langsamer macht!).” von: developer.mozilla.org/en/DOM/Mutation_events

    – Matt Wonlaw

    23. Mai ’12 um 14:01 Uhr


  • Ich liebe das, obwohl nodeName für mich selten nützlich ist. Ich benutze nur e.target.className oder if ($(e.target).hasClass('my-class')) { ....

    – Micha Alcorn

    2. November 12 um 3:24 Uhr

  • Dies wirkt sich nicht auf das Element selbst aus, sondern nur auf seine untergeordneten Elemente.

    – Xdg

    3. April 16 um 08:27 Uhr

  • Erstaunliche Antwort! Hat mir wirklich geholfen!

    – Kir Mazur

    29. März 17 um 6:34 Uhr

  • Es mag langsam und eine schlechte Idee für Code in der Produktion sein, aber dies scheint die einzige Methode zu sein, die funktioniert synchron (im Gegensatz zu MutationObserver) und für irgendein Knoten (nicht nur Knoten, die über jQuery entfernt wurden). Dies ist eine großartige Option zum Debuggen.

    – Bestimmte Leistung

    20. März 19 um 3:39 Uhr

1644313389 36 jQuery – Lost ein Ereignis aus wenn ein Element aus
David Helling

Es gibt kein integriertes Ereignis zum Entfernen von Elementen, aber Sie können eines erstellen, indem Sie die standardmäßige Entfernungsmethode von jQuery erweitern. Beachten Sie, dass der Rückruf aufgerufen werden muss, bevor er tatsächlich entfernt wird, um die Referenz beizubehalten.

(function() {
    var ev = new $.Event('remove'),
        orig = $.fn.remove;
    $.fn.remove = function() {
        $(this).trigger(ev);
        return orig.apply(this, arguments);
    }
})();

$('#some-element').bind('remove', function() {
    console.log('removed!');
    // do pre-mortem stuff here
    // 'this' is still a reference to the element, before removing it
});

// some other js code here [...]

$('#some-element').remove();

Hinweis: Einige Probleme mit dieser Antwort wurden von anderen Postern beschrieben.

  1. Dies funktioniert nicht, wenn der Knoten über entfernt wird html() replace() oder andere jQuery-Methoden
  2. Dieses Ereignis brodelt
  3. jQuery UI überschreibt auch das Entfernen

Die eleganteste Lösung für dieses Problem scheint zu sein: https://stackoverflow.com/a/10172676/216941

jQuery – Lost ein Ereignis aus wenn ein Element aus
zah

Haken .remove() ist nicht der beste Weg, dies zu handhaben, da es viele Möglichkeiten gibt, Elemente von der Seite zu entfernen (z. B. durch Verwendung von .html(), .replace()etc).

Um verschiedene Gefahren durch Speicherlecks zu vermeiden, versucht jQuery intern, die Funktion aufzurufen jQuery.cleanData() für jedes entfernte Element, unabhängig von der Methode, mit der es entfernt wurde.

Weitere Informationen finden Sie in dieser Antwort: Javascript-Speicherlecks

Um die besten Ergebnisse zu erzielen, sollten Sie also den Haken setzen cleanData Funktion, das ist genau das, was die jquery.event.zerstört Plugin macht:

http://v3.javascriptmvc.com/jquery/dist/jquery.event.destroyed.js

  • Diese Erkenntnis über cleanData war sehr hilfreich für mich! Vielen Dank, Joe 🙂

    – Petr Vostrel

    5. April 12 um 16:57 Uhr

  • Schöne Antwort, aber das funktioniert immer noch nur für jQuery-Methoden. Wenn Sie eine Integration mit einer anderen Plattform vornehmen, die Ihnen „den Boden unter den Füßen wegziehen“ kann, ist Adams Antwort am sinnvollsten.

    – Bron Davies

    16. November 12 um 19:37 Uhr


1644313390 449 jQuery – Lost ein Ereignis aus wenn ein Element aus
StriplingWarrior

Für diejenigen, die die jQuery-Benutzeroberfläche verwenden:

Die jQuery-Benutzeroberfläche hat einige der jQuery-Methoden überschrieben, um a zu implementieren remove Ereignis, das nicht nur behandelt wird, wenn Sie das angegebene Element explizit entfernen, sondern auch, wenn das Element durch selbstreinigende jQuery-Methoden (z replace, html, etc.). Auf diese Weise können Sie im Wesentlichen einen Haken in die gleichen Ereignisse setzen, die ausgelöst werden, wenn jQuery die Ereignisse und Daten, die einem DOM-Element zugeordnet sind, “bereinigt”.

John Resig hat angedeutet dass er offen für die Idee ist, dieses Ereignis in einer zukünftigen Version des jQuery-Kerns zu implementieren, aber ich bin mir nicht sicher, wo es derzeit steht.

  • Diese Erkenntnis über cleanData war sehr hilfreich für mich! Vielen Dank, Joe 🙂

    – Petr Vostrel

    5. April 12 um 16:57 Uhr

  • Schöne Antwort, aber das funktioniert immer noch nur für jQuery-Methoden. Wenn Sie eine Integration mit einer anderen Plattform vornehmen, die Ihnen „den Boden unter den Füßen wegziehen“ kann, ist Adams Antwort am sinnvollsten.

    – Bron Davies

    16. November 12 um 19:37 Uhr


Nur jQuery ist erforderlich (keine jQuery-Benutzeroberfläche erforderlich)

(Ich habe diese Erweiterung aus dem jQuery-UI-Framework extrahiert)

Arbeitet mit: empty() und html() und remove()

$.cleanData = ( function( orig ) {
    return function( elems ) {
        var events, elem, i;
        for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
            try {

                // Only trigger remove when necessary to save time
                events = $._data( elem, "events" );
                if ( events && events.remove ) {
                    $( elem ).triggerHandler( "remove" );
                }

            // Http://bugs.jquery.com/ticket/8235
            } catch ( e ) {}
        }
        orig( elems );
    };
} )( $.cleanData );

Mit dieser Lösung können Sie das auch lösen der Eventhandler.

$("YourElemSelector").off("remove");

Versuch es! – Beispiel

$.cleanData = (function(orig) {
  return function(elems) {
    var events, elem, i;
    for (i = 0;
      (elem = elems[i]) != null; i++) {
      try {

        // Only trigger remove when necessary to save time
        events = $._data(elem, "events");
        if (events && events.remove) {
          $(elem).triggerHandler("remove");
        }

        // Http://bugs.jquery.com/ticket/8235
      } catch (e) {}
    }
    orig(elems);
  };
})($.cleanData);


$("#DivToBeRemoved").on("remove", function() {
  console.log("div was removed event fired");
});

$("p").on("remove", function() {
  console.log("p was removed event fired");
});

$("span").on("remove", function() {
  console.log("span was removed event fired");
});

// $("span").off("remove");

$("#DivToBeRemoved").on("click", function() {
  console.log("Div was clicked");
});

function RemoveDiv() {
  //       $("#DivToBeRemoved").parent().html("");    
  $("#DivToBeRemoved").remove();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h3>OnRemove event handler attached to elements `div`, `p` and `span`.</h3>
<div class="container">
  <br>
  <button onclick="RemoveDiv();">Click here to remove div below</button>
  <div id="DivToBeRemoved">
    DIV TO BE REMOVED 
    contains 1 p element 
    which in turn contains a span element
    <p>i am p (within div)
      <br><br><span>i am span (within div)</span></p>
  </div>
</div>

Zusätzlich Demo – jsBin

.

821060cookie-checkjQuery – Löst ein Ereignis aus, wenn ein Element aus dem DOM entfernt wird

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

Privacy policy