Więc obecnie używam czegoś takiego:
$(window).resize(function(){resizedw();});
Ale jest to wywoływane wiele razy podczas procesu zmiany rozmiaru. Czy można złapać wydarzenie, gdy się skończy?
Więc obecnie używam czegoś takiego:
$(window).resize(function(){resizedw();});
Ale jest to wywoływane wiele razy podczas procesu zmiany rozmiaru. Czy można złapać wydarzenie, gdy się skończy?
.one()
aby działało tylko po zakończeniu zmiany rozmiaru, a nie w kółko?Odpowiedzi:
Miałem szczęście z następującą rekomendacją: http://forum.jquery.com/topic/the-resizeend-event
Oto kod, więc nie musisz przekopywać linku i źródła jego postu:
Dzięki sime.vidas za kod!
źródło
new Date(-1E12)
- tzn. JSLint ostrzega przed użyciem00
.rtime: Date; .... if (+new Date() - +rtime < delta)
a w funkcji zmiany rozmiaru maszynopisu powinna być taka funkcja strzałkiresizeend=()=>
. Ponieważ w funkcji zmiany rozmiaruthis
odwołanie do obiektu okna.Możesz użyć
setTimeout()
iclearTimeout()
Przykład kodu na jsfiddle .
źródło
$(document)
, wykrywanie myszy byłoby ograniczone do użytkowników z systemem Microsoft Windows i wrażliwymi wersjami jego przeglądarki Internet Explorer: iedataleak.spider.io/demoOto kod, który piszę zgodnie z odpowiedzią @Mark Coleman:
Dzięki Mark!
źródło
resizeTimer
jest zmienną globalną, co oznacza, że nie jest zdefiniowanawindow
, więc jest dokładnie taka sama jak tutaj, tylko ten przykład jest lepszy, ponieważ nie musisz definiować zmiennej zewnętrznie. i sensowne jest również dodanie tej zmiennej dowindow
obiektu, ponieważ jest to obiekt, z którym powiązany jest detektor zdarzeń.Internet Explorer zapewnia zdarzenie resizeEnd . Inne przeglądarki wyzwalają zdarzenie zmiany rozmiaru wiele razy podczas zmiany rozmiaru.
Są tutaj inne świetne odpowiedzi, które pokazują, jak używać setTimeout i .throttle ,.debounce metody z lodash i podkreślenia, więc będę wspomnieć Ben Alman za przepustnicę-nieczułości jQuery plugin , który realizuje to, czego szukasz.
Załóżmy, że masz tę funkcję, którą chcesz uruchomić po zmianie rozmiaru:
Przykład przepustnicy
W poniższym przykładzie
onResize()
będzie wywoływana tylko raz na 250 milisekund podczas zmiany rozmiaru okna.Przykład odbicia
W poniższym przykładzie
onResize()
zostanie wywołany tylko raz na końcu akcji zmiany rozmiaru okna. Osiąga to ten sam wynik, który @Mark przedstawia w swojej odpowiedzi.źródło
Istnieje eleganckie rozwiązanie wykorzystujące Underscore.js. Jeśli więc używasz go w swoim projekcie, możesz wykonać następujące czynności -
To powinno wystarczyć :) Ale jeśli chcesz przeczytać więcej na ten temat, możesz sprawdzić mój post na blogu -
http://rifatnabi.com/post/detect-end-of-jquery-resize-event-using-underscore -debounce(martwy link)źródło
lodash
Jednym z rozwiązań jest rozszerzenie jQuery o funkcję, np .:
resized
Przykładowe użycie:
$(window).resized(myHandler, 300);
źródło
Możesz przechowywać identyfikator odwołania do dowolnego setInterval lub setTimeout. Lubię to:
Aby to zrobić bez zmiennej „globalnej”, możesz dodać zmienną lokalną do samej funkcji. Dawny:
źródło
Można używać
setTimeout()
iclearTimeout()
w połączeniu zjQuery.data
:Aktualizacja
Napisałem rozszerzenie, aby ulepszyć domyślną
on
(&bind
) -event-handler jQuery . Dołącza funkcję obsługi zdarzenia dla jednego lub więcej zdarzeń do wybranych elementów, jeśli zdarzenie nie zostało wyzwolone dla danego interwału. Jest to przydatne, jeśli chcesz uruchomić oddzwonienie dopiero po opóźnieniu, takim jak zdarzenie zmiany rozmiaru lub inne. https://github.com/yckart/jquery.unevent.jsUżywaj go jak każdego innego
on
lubbind
-event obsługi, z tym wyjątkiem, że możesz przekazać dodatkowy parametr jako ostatni:http://jsfiddle.net/ARTsinn/EqqHx/
źródło
Istnieje znacznie prostsza metoda wykonania funkcji na końcu zmiany rozmiaru niż obliczenie czasu delta między dwoma wywołaniami, po prostu zrób to w następujący sposób:
I odpowiednik Angular2 :
W przypadku metody kątowej użyj
() => { }
zapisu w,setTimeout
aby zachować zakres, w przeciwnym razie nie będziesz w stanie wykonywać żadnych wywołań funkcji ani ich używaćthis
.źródło
Jest to modyfikacja powyższego kodu Dolana, dodałem funkcję, która sprawdza rozmiar okna na początku zmiany rozmiaru i porównuje go z wielkością na końcu zmiany rozmiaru, jeśli rozmiar jest większy lub mniejszy niż margines ( np. 1000), a następnie przeładowuje.
źródło
Odpowiedź Marka Colemana jest zdecydowanie lepsza niż wybrana odpowiedź, ale jeśli chcesz uniknąć zmiennej globalnej dla identyfikatora limitu czasu (
doit
zmiennej w odpowiedzi Marka), możesz wykonać jedną z następujących czynności:(1) Użyj natychmiast wywołanego wyrażenia funkcyjnego (IIFE), aby utworzyć zamknięcie.
(2) Użyj właściwości funkcji obsługi zdarzeń.
źródło
sam napisałem funkcję owijania litte ...
Oto użycie:
źródło
źródło
Cóż, jeśli chodzi o menedżera okien, każde zdarzenie zmiany rozmiaru jest własnym komunikatem, z wyraźnym początkiem i końcem, więc technicznie rzecz biorąc, za każdym razem, gdy zmienia się rozmiar okna, jest to koniec.
Powiedziawszy to, może chcesz opóźnić swoją kontynuację? Oto przykład.
źródło
Oto BARDZO prosty skrypt, który wyzwala zarówno zdarzenie „resizestart”, jak i „resizeend” na obiekcie okna.
Nie ma potrzeby marnowania czasu i dat.
The
d
Zmienna reprezentuje liczbę milisekund między zdarzenia zmiany rozmiaru przed wywołaniem zdarzenia zakończenia zmiany rozmiaru, można grać z tym, aby zmienić sposób wrażliwy zdarzenie koniec jest.Aby wysłuchać tych wydarzeń, wystarczy:
resizestart:
$(window).on('resizestart', function(event){console.log('Resize Start!');});
zmiana rozmiaru:
$(window).on('resizeend', function(event){console.log('Resize End!');});
źródło
To jest to, czego używam do opóźniania powtarzających się działań, można je wywołać w wielu miejscach w kodzie:
Stosowanie:
źródło
ponieważ wybrana odpowiedź tak naprawdę nie działała .. a jeśli nie używasz jquery, tutaj jest prosta funkcja przepustnicy z przykładem użycia jej przy zmianie rozmiaru okna
źródło
działało to dla mnie, ponieważ nie chciałem używać żadnych wtyczek.
Przy ponownym rozmiarze okna wywołaj „setFn”, który pobierze szerokość okna i zapisz jako „originalWindowSize”. Następnie wywołaj „checkFn”, który po 500 ms (lub twoich preferencjach) pobiera bieżący rozmiar okna i porównuje oryginał z bieżącym, jeśli nie są one takie same, wówczas okno jest ponownie zmieniane. Nie zapomnij usunąć komunikatów konsoli podczas produkcji, a (opcjonalnie) samoczynnie uruchomi się „setFn”.
źródło
To działało dla tego, co próbowałem zrobić w chromie. Spowoduje to oddzwonienie dopiero po 200 ms od ostatniego zdarzenia zmiany rozmiaru.
źródło
AKTUALIZACJA!
Lepsza alternatywa również stworzona przeze mnie jest tutaj: https://stackoverflow.com/a/23692008/2829600 (obsługuje „funkcje usuwania”)
ORYGINALNY POCZTA:
Napisałem tę prostą funkcję do obsługi opóźnienia w wykonaniu, przydatną w jQuery .scroll () i .resize () Tak więc callback_f uruchomi się tylko raz dla określonego ciągu id.
źródło
$(window).resize(function() { delay_exec('test1', 30, function() { ... delayed stuff here ... }); });
? W przeciwnym razie całkiem czysty kod. Dzięki za udostępnienie. :)Zdarzenia ResizeStart i ResizeEnd dla okna
http://jsfiddle.net/04fLy8t4/
Zaimplementowałem funkcję, która wyzwala dwa zdarzenia w elemencie DOM użytkownika:
Kod:
źródło
źródło
Nie wiem, czy mój kod działa na innych, ale naprawdę robi dla mnie świetną robotę. Wpadłem na ten pomysł, analizując kod Dolan Antenucci, ponieważ jego wersja nie działa dla mnie i naprawdę mam nadzieję, że będzie komuś pomocny.
źródło
Napisałem funkcję, która przekazuje funkcję, gdy jest opakowana w dowolne zdarzenie zmiany rozmiaru. Używa interwału, aby zmiana rozmiaru nawet nie powodowała ciągłego przekroczenia limitu czasu. Dzięki temu może wykonywać niezależnie od zdarzenia zmiany rozmiaru innego niż wpis dziennika, który powinien zostać usunięty podczas produkcji.
https://github.com/UniWrighte/resizeOnEnd/blob/master/resizeOnEnd.js
}
źródło