Próbuję dowiedzieć się, jak wykonać kod js, gdy element zostanie usunięty ze strony:
jQuery('#some-element').remove(); // remove some element from the page
/* need to figure out how to independently detect the above happened */
czy istnieje wydarzenie dostosowane do tego, na przykład:
jQuery('#some-element').onremoval( function() {
// do post-mortem stuff here
});
dzięki.
Odpowiedzi:
Właśnie sprawdzone, jest już wbudowane w bieżącą wersję JQuery:
jQuery - v1.9.1
jQuery UI - v1.10.2
Ważne : Jest to funkcjonalność skryptu interfejsu użytkownika Jquery (nie JQuery), więc aby załadować oba skrypty (jquery i jquery-ui), należy go załadować. Oto przykład: http://jsfiddle.net/72RTz/
źródło
remove
na elemencie, zostanie on uruchomiony, ale jeśli element zostanie zniszczony w inny sposób, po nadpisaniu powiedz, że nie działa.Możesz do tego użyć specjalnych wydarzeń jQuery .
W całej prostocie
Ustawiać:
Stosowanie:
Dodatek do odpowiedzi na komentarze Pierre'a i DesignerGuya:
Aby nie wywoływać wywołania zwrotnego podczas połączenia
$('.thing').off('destroyed')
, zmień warunek if na:if (o.handler && o.type !== 'destroyed') { ... }
źródło
o.handler()
aby wo.handler.apply(this,arguments)
przeciwnym razie zdarzenia i obiekty danych nie byłyby przekazywane przez detektor zdarzeń.$('.thing').unbind('destroyed')
może to być naprawdę denerwujące (ponieważ unbind oznacza, że nie chcemy, aby program obsługiwał się ...)Możesz powiązać ze zdarzeniem DOMNodeRemoved (część specyfikacji DOM Level 3 WC3).
Działa w IE9, najnowszych wydaniach Firefox i Chrome.
Przykład:
Możesz również otrzymywać powiadomienia o wstawianiu elementów przez powiązanie z
DOMNodeInserted
źródło
e.target.className
lubif ($(e.target).hasClass('my-class')) { ...
.Nie ma wbudowanego zdarzenia do usuwania elementów, ale możesz je utworzyć, stosując domyślną metodę usuwania fałszywego rozszerzenia jQuery. Pamiętaj, że wywołanie zwrotne musi zostać wywołane przed faktycznym usunięciem, aby zachować odniesienie.
Uwaga: niektóre problemy z tą odpowiedzią zostały nakreślone przez inne plakaty.
html()
replace()
innych metod jQueryNajbardziej eleganckim rozwiązaniem tego problemu wydaje się być: https://stackoverflow.com/a/10172676/216941
źródło
$('#some-element').bind('remove', function(ev) { if (ev.target === this) { console.log('removed!'); } });
Przechwytywanie
.remove()
nie jest najlepszym sposobem na poradzenie sobie z tym, ponieważ istnieje wiele sposobów usuwania elementów ze strony (np. Przy użyciu.html()
,.replace()
itp).Aby zapobiec różnym zagrożeniom wycieku pamięci, wewnętrznie jQuery spróbuje wywołać funkcję
jQuery.cleanData()
dla każdego usuniętego elementu, niezależnie od metody użytej do jego usunięcia.Aby uzyskać więcej informacji, zobacz tę odpowiedź: wycieki pamięci javascript
Tak więc, aby uzyskać najlepsze wyniki, powinieneś podpiąć
cleanData
funkcję, która właśnie robi wtyczka jquery.event.destroyed :http://v3.javascriptmvc.com/jquery/dist/jquery.event.destroyed.js
źródło
cleanData
był dla mnie bardzo pomocny! Dziękuję bardzo, Joe :)Dla tych, którzy używają interfejsu użytkownika jQuery:
jQuery UI jest przesłonięta niektóre z metod jQuery zaimplementować
remove
zdarzenie, które zostanie obsłużony nie tylko wtedy, gdy wyraźnie usunąć dany element, ale również wtedy, gdy element zostanie usunięty z DOM żadnymi samoczyszczących metod jQuery (npreplace
,html
itp) . Zasadniczo pozwala to na zaczepienie tych samych zdarzeń, które są uruchamiane, gdy jQuery „oczyszcza” zdarzenia i dane powiązane z elementem DOM.John Resig wskazał , że jest otwarty na pomysł zaimplementowania tego wydarzenia w przyszłej wersji rdzenia jQuery, ale nie jestem pewien, gdzie obecnie się znajduje.
źródło
Wymagane jest tylko jQuery (nie wymaga interfejsu użytkownika jQuery)
( Wyodrębniłem to rozszerzenie ze środowiska interfejsu użytkownika jQuery )
Działa z:
empty()
ihtml()
iremove()
Dzięki temu rozwiązaniu możesz również odznaczyć moduł obsługi zdarzeń.
Spróbuj! - przykład
Dodatkowe demo - jsBin
źródło
Nie udało mi się uzyskać tej odpowiedzi do rozpakowania (pomimo aktualizacji, patrz tutaj ), ale udało mi się to rozwiązać. Odpowiedzią było utworzenie zdarzenia specjalnego „destroy_proxy”, które wywołało zdarzenie „zniszczone”. Umieszczasz detektor zdarzeń zarówno na „zniszczone_proxy”, jak i „zniszczone”, a następnie, gdy chcesz cofnąć powiązanie, po prostu cofnij powiązanie zdarzenia „zniszczone”:
Oto skrzypce
źródło
Podoba mi się odpowiedź mtkopone przy użyciu specjalnych zdarzeń jQuery, ale zauważ, że to nie działa a) gdy elementy są odłączone zamiast usuwane lub b) gdy niektóre stare biblioteki nie jquery używają innerHTML do niszczenia twoich elementów
źródło
detach
jest używany szczególnie, aby nie uruchamiać czyszczenia, ponieważ prawdopodobnie planowane jest ponowne dołączenie elementu później. b) jest nadal prawdą i nie ma jeszcze niezawodnej obsługi, przynajmniej odkąd zdarzenia mutacji DOM mogą być szeroko wdrażane.Nie jestem pewien, czy istnieje do tego uchwyt zdarzenia, więc musiałbyś zachować kopię DOM i porównać ją z istniejącą DOM w jakiejś pętli odpytywania - co może być dość nieprzyjemne. Firebug robi to jednak - jeśli przejrzysz HTML i wykonasz kilka zmian DOM, na krótki czas podświetli zmiany na żółto w konsoli Firebug.
Alternatywnie możesz utworzyć funkcję usuwania ...
źródło
Oto jak utworzyć detektor jQuery na żywo :
Lub:
źródło
Zdarzenie „remove” z jQuery działa dobrze, bez dodawania. Może być bardziej niezawodne w czasie, aby zastosować prostą sztuczkę, zamiast łatania jQuery.
Po prostu zmodyfikuj lub dodaj atrybut w elemencie, który chcesz usunąć z DOM. W ten sposób można uruchomić dowolną funkcję aktualizacji, która po prostu zignoruje elementy na drodze do zniszczenia, z atrybutem „do_not_count_it”.
Załóżmy, że mamy tabelę z komórkami odpowiadającymi cenom i że musisz pokazać tylko ostatnią cenę: Jest to selektor uruchamiany po usunięciu komórki ceny (mamy przycisk w każdym wierszu tabeli, który to pokazuje, nie pokazano tutaj)
A tutaj jest funkcja, która znajduje ostatnią cenę w tabeli, nie biorąc pod uwagę ostatniej, jeśli to ta, która została usunięta. Rzeczywiście, po uruchomieniu zdarzenia „remove” i wywołaniu tej funkcji element nie jest jeszcze usuwany.
Na koniec funkcja update_prices () działa dobrze, a następnie element DOM jest usuwany.
źródło
odnosząc się do odpowiedzi @David:
Gdy chcesz to zrobić za pomocą innej funkcji, np. html () jak w moim przypadku, nie zapomnij dodać return w nowej funkcji:
źródło
To.
źródło
rozszerzenie odpowiedzi Adama, ponieważ musisz uprzedzić domyślną, oto obejście:
źródło
Możemy również użyć DOMNodeRemoved:
źródło