Korzystam z jQuery na mojej stronie i chciałbym wywoływać pewne działania, gdy określony div jest widoczny.
Czy możliwe jest dołączenie jakiegoś „niewidocznego” modułu obsługi zdarzeń do dowolnych div i uruchomienie określonego kodu, gdy div jest widoczny?
Chciałbym coś w rodzaju następującego pseudokodu:
$(function() {
$('#contentDiv').isvisible(function() {
alert("do something");
});
});
Kod alertu („zrób coś”) nie powinien zostać uruchomiony, dopóki contentDiv nie stanie się rzeczywiście widoczny.
Dzięki.
javascript
jquery
frankadelic
źródło
źródło
Odpowiedzi:
Zawsze możesz dodać do oryginalnej .show () metody , abyś nie musiał wyzwalać zdarzeń za każdym razem, gdy coś wyświetlasz, lub jeśli potrzebujesz go do pracy ze starszym kodem:
Rozszerzenie Jquery:
Przykład użycia:
To skutecznie pozwala zrobić coś przedShow i AfterShow, jednocześnie wykonując normalne zachowanie oryginalnej metody .show ().
Możesz także utworzyć inną metodę, abyś nie musiał zastępować oryginalnej metody .show ().
źródło
fadeTo
funkcja nie działa poprawnie po zaimplementowaniu tej funkcjiProblem jest rozwiązywany przez obserwatorów mutacji DOM . Pozwalają powiązać obserwatora (funkcję) ze zdarzeniami zmieniającej się treści, tekstu lub atrybutów elementów dom.
Wraz z wydaniem IE11 wszystkie główne przeglądarki obsługują tę funkcję, sprawdź http://caniuse.com/mutationobserver
Przykładowy kod jest następujący:
źródło
Nie ma żadnego zdarzenia natywnego, do którego można by się przyłączyć, ale można wywołać zdarzenie ze skryptu po tym, jak div będzie widoczny za pomocą. wyzwalaczfunkcja
na przykład
źródło
show()
wywoływany jest z wielu miejsc innych niż omawiany powyżej blok kodu?onIsVisible
ponieważ użycie „isVisible” jest teraz trochę niejednoznaczne.Możesz użyć wtyczki Live Query jQuery . I napisz kod w następujący sposób:
Wtedy za każdym razem, gdy contentDiv będzie widoczny, zostanie wyświetlone ostrzeżenie „zrób coś”!
źródło
Rozwiązanie redsquare jest właściwą odpowiedzią.
Ale jako rozwiązanie W TEORII możesz napisać funkcję, która wybiera elementy sklasyfikowane przez
.visibilityCheck
( nie wszystkie widoczne elementy ) i sprawdza ichvisibility
wartość właściwości; jeślitrue
to zrób coś.Następnie funkcja powinna być wykonywana okresowo za pomocą
setInterval()
funkcji. Możesz zatrzymać stoper za pomocąclearInterval()
po udanym wywołaniu.Oto przykład:
Możesz również wprowadzić na nim pewne ulepszenia wydajności, jednak rozwiązanie jest w zasadzie absurdalne i można je stosować w akcji. Więc...
źródło
display:none
?Poniższy kod (pobrany z http://maximeparmentier.com/2012/11/06/bind-show-hide-events-w--jquery/ ) umożliwi ci korzystanie
$('#someDiv').on('show', someFunc);
.źródło
el.apply(this, arguments)
aby to naprawić.Jeśli chcesz wywołać zdarzenie na wszystkich elementach (i elementach potomnych), które są faktycznie widoczne, za pomocą $ .show, Toggle, ToggleClass, addClass lub removeClass:
A teraz twój element:
Możesz dodać przesłonięcia do dodatkowych funkcji jQuery, dodając je do tablicy u góry (np. „Attr”)
źródło
wyzwalacz zdarzenia ukryj / pokaż oparty na idei Glennsa: usunięto przełącznik, ponieważ uruchamia show / hide i nie chcemy 2 pożarów dla jednego zdarzenia
źródło
Miałem ten sam problem i stworzyłem wtyczkę jQuery, aby rozwiązać ten problem na naszej stronie.
https://github.com/shaunbowe/jquery.visibilityChanged
Oto, jak użyjesz go na podstawie swojego przykładu:
źródło
Użyj punktów nawigacyjnych jQuery:
Inne przykłady na stronie jQuery Waypoints .
źródło
Pomogło mi tutaj ostatnie wypełnienie specyfikacji ResizeObserver :
Zauważ, że to crossbrowser i performant (bez odpytywania).
źródło
Wykonałem prostą funkcję setinterval, aby to osiągnąć. Jeśli element z klasą div1 jest widoczny, ustawia div2 jako widoczny. Nie znam dobrej metody, ale proste rozwiązanie.
źródło
Możesz także wypróbować wtyczkę jQuery, która pojawia się w równoległym wątku https://stackoverflow.com/a/3535028/741782
źródło
To wsparcie łagodzenia i wyzwalania zdarzenia po zakończeniu animacji! [testowane na jQuery 2.2.4]
Zainspirowany http://viralpatel.net/blogs/jquery-trigger-custom-event-show-hide-element/
źródło
Wystarczy powiązać selektor z wyzwalaczem i umieścić kod w zdarzeniu wyzwalacza:
źródło
Dostępna jest wtyczka jQuery do oglądania zmian atrybutów DOM,
https://github.com/darcyclarke/jQuery-Watch-Plugin
Wtyczka otacza Wszystko, co musisz zrobić, to powiązać MutationObserver
Następnie możesz go użyć do oglądania div, używając:
źródło
Mam nadzieję, że wykona to zadanie w najprostszy sposób:
źródło
Zmieniłem wyzwalacz zdarzenia ukryj / pokaż z Catalint w oparciu o pomysł Glenns. Mój problem polegał na tym, że mam modułową aplikację. Przełączam się między modułami pokazującymi i ukrywającymi rodziców div. Potem, gdy ukrywam moduł i pokazuję inny, z jego metodą mam wyraźne opóźnienie przy zmianie między modułami. Czasami potrzebuję tylko zapalić to wydarzenie, a także niektóre specjalne dzieci. Postanowiłem więc powiadomić tylko dzieci o klasie „displayObserver”
Następnie, gdy dziecko chce słuchać zdarzenia „pokaż” lub „ukryj”, muszę mu dodać klasę „displayObserver”, a gdy nie chce go dalej słuchać, usuwam mu klasę
Życzę pomocy
źródło
Jednym ze sposobów, aby to zrobić.
Działa tylko w przypadku zmian widoczności, które są dokonywane przez zmianę klasy css, ale można go rozszerzyć, aby również obserwował zmiany atrybutów.
źródło
moje rozwiązanie:
przykładowe użycie:
źródło
źródło
Ta kontrola automatyczna kodu nie wymaga zapytania kontroli widocznej lub niewidocznej
źródło