Mam element div, który zawiera zawartość, która jest dodawana i usuwana dynamicznie, więc jej wysokość często się zmienia. Mam również element div, który jest całkowicie umieszczony bezpośrednio pod spodem za pomocą javascript, więc jeśli nie mogę wykryć, kiedy zmienia się wysokość elementu div, nie mogę zmienić jego położenia poniżej.
Jak więc mogę wykryć, kiedy zmienia się wysokość tego elementu div? Zakładam, że jest jakieś zdarzenie jQuery, którego muszę użyć, ale nie jestem pewien, do którego z nich się podłączyć.
javascript
jquery
Bob Somers
źródło
źródło
Odpowiedzi:
Użyj czujnika zmiany rozmiaru z biblioteki css-element-queries:
https://github.com/marcj/css-element-queries
Wykorzystuje podejście oparte na zdarzeniach i nie marnuje czasu na procesor. Działa we wszystkich przeglądarkach, w tym. IE7 +.
źródło
Kiedyś napisałem wtyczkę do nasłuchiwania zmian, która w zasadzie dodaje funkcję odbiornika przy zmianie atrybutu. Chociaż mówię to jako wtyczka, w rzeczywistości jest to prosta funkcja napisana jako wtyczka jQuery ... więc jeśli chcesz ... usuń kod wtyczki i użyj jej podstawowych funkcji.
Uwaga: ten kod nie używa odpytywania
sprawdź to proste demo http://jsfiddle.net/aD49d/
Strona wtyczki: http://meetselva.github.io/attrchange/
Wersja zminimalizowana: (1,68 kb)
źródło
Możesz użyć zdarzenia DOMSubtreeModified
Ale to się uruchomi, nawet jeśli wymiary się nie zmienią, a ponowne przypisanie pozycji za każdym razem, gdy wystrzeli, może mieć wpływ na wydajność. Z mojego doświadczenia w stosowaniu tej metody wynika, że sprawdzenie, czy wymiary uległy zmianie, jest tańsze, więc możesz rozważyć połączenie tych dwóch.
Lub jeśli bezpośrednio zmieniasz element div (zamiast zmieniać go pod wpływem danych wejściowych użytkownika w nieprzewidywalny sposób, np. Jeśli jest to contentEditable), możesz po prostu uruchomić zdarzenie niestandardowe w dowolnym momencie.
Wada: IE i Opera nie implementują tego zdarzenia.
źródło
Oto jak ostatnio poradziłem sobie z tym problemem:
Wiem, że spóźniłem się na imprezę kilka lat, myślę, że moja odpowiedź może pomóc niektórym ludziom w przyszłości, bez konieczności pobierania jakichkolwiek wtyczek.
źródło
Możesz użyć
MutationObserver
class.MutationObserver
zapewnia programistom sposób reagowania na zmiany w DOM. Został zaprojektowany jako zamiennik zdarzeń mutacji zdefiniowanych w specyfikacji DOM3 Events.Przykład ( źródło )
źródło
Istnieje wtyczka jQuery, która bardzo dobrze sobie z tym radzi
http://www.jqui.net/jquery-projects/jquery-mutate-official/
tutaj jest demo z różnymi scenariuszami zmiany wysokości, jeśli zmienisz rozmiar czerwonego obramowania div.
http://www.jqui.net/demo/mutate/
źródło
setTimeout
, więc w skrócie będzie to 1ms + [czas potrzebny na sprawdzenie], ale chodziło o to, aby słuchać bez przerwy, kiedy to zrobisz, uruchom go ponownie, to tak kolejka. Jestem pewien, że mógłbym to zrobić dużo lepiej, ale nie za dużo czasu.W odpowiedzi na user007:
Jeśli wysokość twojego elementu zmienia się z powodu dołączania do niego elementów za pomocą
.append()
, nie powinieneś potrzebować wykrywać zmiany wysokości. Po prostu dodaj zmianę położenia drugiego elementu w tej samej funkcji, w której dodajesz nową zawartość do pierwszego elementu.Jak w:
Przykład roboczy
źródło
Możesz zrobić prosty setInterval.
EDYTOWAĆ:
To jest przykład z klasą. Ale możesz zrobić coś łatwiejszego.
źródło
Możesz tego użyć, ale obsługuje tylko przeglądarki Firefox i Chrome.
źródło
Całkiem proste, ale działa:
źródło