Czy w JavaScript można wykryć czas „ bezczynności ”?
Moim podstawowym zastosowaniem prawdopodobnie byłoby pobranie lub wstępne załadowanie treści.
Czas bezczynności: okres bezczynności użytkownika lub bez użycia procesora
javascript
Cherian
źródło
źródło
Odpowiedzi:
Oto prosty skrypt używający JQuery, który obsługuje zdarzenia ruchów myszy i naciśnięć klawiszy. Po upływie czasu strona zostanie ponownie załadowana.
źródło
setInterval
, który następnie jest oceniany jako JavaScript.idleTime++;
zamiastidleTime = idleTime + 1;
'mousemove keydown click'
użycie bit flagi (Event.MOUSEMOVE | Event.KEYDOWN | Event.CLICK
), ponieważ są one o wiele szybsze niż operacje na łańcuchach. Ale czy naprawdę chcesz to zrobić?Bez użycia jQuery, tylko waniliowy JavaScript:
I uruchom funkcję tam, gdzie jej potrzebujesz (na przykład: onPageLoad).
W razie potrzeby możesz dodać więcej zdarzeń DOM. Najczęściej używane są:
Lub zarejestruj pożądane zdarzenia za pomocą tablicy
Lista wydarzeń DOM : http://www.w3schools.com/jsref/dom_obj_event.asp
Pamiętaj o użyciu
window
lubdocument
zgodnie z własnymi potrzebami. Tutaj możesz zobaczyć różnice między nimi: Jaka jest różnica między oknem, ekranem i dokumentem w JavaScript?Kod zaktualizowany o @ frank-conijn i @daxchen ulepsz:
window.onscroll
nie będzie uruchamiany, jeśli przewijanie znajduje się w przewijalnym elemencie, ponieważ zdarzenia przewijania nie pękają.window.addEventListener('scroll', resetTimer, true)
, trzeci argument mówi słuchaczowi, aby złapał zdarzenie podczas fazy przechwytywania zamiast fazy bąbelkowej.źródło
document.onload = function () { inactivityTime(); }; document.onmousedown = function () { inactivityTime(); }; document.onkeypress = function () { inactivityTime(); }; document.ontouchstart = function () { inactivityTime(); };
Poprawa odpowiedzi Equimana:
.
Oprócz ulepszeń w zakresie wykrywania aktywności i zmiany z
document
nawindow
, ten skrypt faktycznie wywołuje funkcję, a nie pozwala jej pozostać bezczynnym.Nie wychwytuje bezpośrednio zerowego użycia procesora, ale jest to niemożliwe, ponieważ wykonanie funkcji powoduje użycie procesora. Bezczynność użytkownika ostatecznie prowadzi do zerowego użycia procesora, więc pośrednio łapie zerowe użycie procesora.
źródło
window.onscroll
nie uruchomi się, jeśli przewijanie znajduje się w przewijalnym elemencie, ponieważ zdarzenia przewijania nie pękają. Używającwindow.addEventListener('scroll', resetTimer, true)
, trzeci argument mówi słuchaczowi, aby złapał zdarzenie podczascapture
fazy zamiastbubble
fazy (IE> 8), zobacz tę odpowiedźdocument.onscroll
ma tego samego problemu, nie uruchamia się, jeśli przewijanie znajduje się w przewijalnym dziecku?addEventListener
zamiastonscroll
.Stworzyłem małą bibliotekę, która robi to rok temu:
https://github.com/shawnmclean/Idle.js
Opis:
Użytkownicy programu Visual Studio mogą uzyskać go z NuGet poprzez:
PM> Install-Package Idle.js
źródło
Oto przybliżona implementacja pomysłu tvanfosson przez jQuery:
źródło
setInterval
sznurka! Po prostu podaj funkcję jako zmienną!setInterval()
oceny wyrażenia w zasięgu globalnym, a zatem nie znajdzietimerIncrement()
funkcji, która znajduje się w funkcji obsługi .ready. Jest to kolejny powód, dla którego NIGDY nie należy przekazywać ciągów znakówsetInterval()
. Wystarczy przekazać rzeczywiste odwołanie do funkcji i nie będzie tego problemu, ponieważ są one oceniane w bieżącym zakresie.Podobne do powyższego rozwiązania Iconic (z niestandardowym zdarzeniem jQuery) ...
źródło
Możesz to zrobić bardziej elegancko dzięki podkreśleniu i jquery -
źródło
Moja odpowiedź została zainspirowana odpowiedzią vijay , ale jest krótszym, bardziej ogólnym rozwiązaniem, które, jak sądzę, podzieliłbym się z każdym, komu może pomóc.
W obecnej postaci ten kod zostanie wykonany natychmiast i ponownie załaduje bieżącą stronę po 3 minutach braku ruchu myszy lub naciskania klawiszy.
Wykorzystuje zwykły waniliowy JavaScript i natychmiast wywoływane wyrażenie funkcyjne, aby obsłużyć limity czasu bezczynności w czysty i samodzielny sposób.
źródło
onclick
przypisanie, ponieważ prawdopodobnie nie jest to konieczneonmousemove
, ale oczywiście każde z tych zdarzeń, które są uruchamiane programowo, będzie nadal resetowaneidleCounter
. Nie jestem pewien, dlaczego symulowałbyś interakcję użytkownika zamiast po prostu wywoływać funkcję, ale jeśli jest to coś, co musisz zrobić z jakiegoś powodu, ta odpowiedź oczywiście nie zadziała dla ciebie, podobnie jak większość innych odpowiedzi spojrzałem na to pytanie.Znam to stosunkowo stare pytanie, ale miałem ten sam problem i znalazłem całkiem dobre rozwiązanie.
Użyłem: jquery.idle i potrzebowałem tylko:
Zobacz demo JsFiddle .
(Tylko dla informacji: zobacz to w celu śledzenia zdarzeń zaplecza prowadzi do ładowania przeglądarki )
źródło
keepTracking
opcję nafalse
. Jeśli chcesz zresetować, możesz spróbować ponownie zainicjować. Oto zmodyfikowany przykład, który uruchomiłby się tylko raz: jsfiddle.net/f238hchm/12Wszystkie poprzednie odpowiedzi mają zawsze aktywny moduł obsługi myszy. Jeśli procedura obsługi to jQuery, dodatkowe przetwarzanie wykonywane przez jQuery może się sumować. Zwłaszcza jeśli użytkownik korzysta z myszy do gier, może wystąpić nawet 500 zdarzeń na sekundę.
To rozwiązanie pozwala uniknąć obsługi każdego zdarzenia myszy. Powoduje to niewielki błąd synchronizacji, który można dostosować do własnych potrzeb.
http://jsfiddle.net/jndxq51o/
źródło
$(startTimer)
to równoważne z$(document).ready(startTimer)
, gwarantuje, że DOM jest gotowy, zanim zaczepisz zdarzenia myszy i naciśnięcia klawisza.Prawdopodobnie możesz zhakować coś razem, wykrywając ruch myszy na treści formularza i aktualizując zmienną globalną o czasie ostatniego ruchu. Potrzebny byłby wtedy licznik interwałowy, który okresowo sprawdza czas ostatniego ruchu i robi coś, jeśli minęło wystarczająco dużo czasu od wykrycia ostatniego ruchu myszy.
źródło
Napisałem małą klasę ES6, aby wykrywać aktywność i w inny sposób uruchamiać zdarzenia w czasie bezczynności. Obejmuje klawiaturę, mysz i dotyk , może być aktywowany i dezaktywowany oraz ma bardzo uproszczony interfejs API:
To nie nie zależą od jQuery, choć być może trzeba go uruchomić poprzez Babel do wspierania starszych przeglądarek.
https://gist.github.com/4547ef5718fd2d31e5cdcafef0208096
Mogę wydać go jako pakiet npm, gdy otrzymam jakieś uwagi.
źródło
Jeśli kierujesz reklamy na obsługiwaną przeglądarkę (Chrome lub Firefox od grudnia 2018 r.), Możesz eksperymentować z requestIdleCallback i dołączyć podkładkę requestIdleCallback dla nieobsługiwanych przeglądarek.
źródło
Wypróbuj ten kod, działa idealnie.
źródło
Myślę, że ten kod jquery jest idealny, choć skopiowany i zmodyfikowany z powyższych odpowiedzi !! nie zapomnij dołączyć biblioteki jquery do swojego pliku!
źródło
Problem ze wszystkimi tymi rozwiązaniami, choć poprawnymi, są niepraktyczne, biorąc pod uwagę cenny zestaw limitów czasu sesji, używając PHP, .NET lub w pliku Application.cfc dla programistów Coldfusion. Czas ustawiony w powyższym rozwiązaniu musi zostać zsynchronizowany z limitem czasu sesji po stronie serwera. Jeśli te dwie nie zostaną zsynchronizowane, możesz napotkać problemy, które po prostu sfrustrują i wprowadzą użytkowników w błąd. Na przykład limit czasu sesji po stronie serwera może być ustawiony na 60 minut, ale użytkownik może uważać, że jest bezpieczny, ponieważ przechwytywanie czasu bezczynności JavaScript zwiększyło całkowity czas, jaki użytkownik może spędzić na jednej stronie. Użytkownik mógł spędzić czas na wypełnianiu długiego formularza, a następnie przechodzi do jego przesłania. Upłynął limit czasu sesji przed przetworzeniem formularza. Daję moim użytkownikom 180 minut, a następnie użyj JavaScript, aby automatycznie wylogować użytkownika. Zasadniczo, używając części powyższego kodu, aby utworzyć prosty licznik czasu, ale bez części zdarzenia myszy przechwytującej. W ten sposób czas mojej strony klienta i serwera doskonale się synchronizuje. Nie ma zamieszania, jeśli pokażesz czas użytkownikowi w interfejsie użytkownika, ponieważ zmniejsza się. Za każdym razem, gdy otwierana jest nowa strona w CMS, sesja po stronie serwera i zegar JavaScript są resetowane. Prosty i elegancki. Jeśli użytkownik pozostaje na jednej stronie przez ponad 180 minut, to na pierwszym miejscu wydaje mi się, że coś jest nie tak. jak to zmniejsza. Za każdym razem, gdy otwierana jest nowa strona w CMS, sesja po stronie serwera i zegar JavaScript są resetowane. Prosty i elegancki. Jeśli użytkownik pozostaje na jednej stronie przez ponad 180 minut, to na pierwszym miejscu wydaje mi się, że coś jest nie tak. jak to zmniejsza. Za każdym razem, gdy otwierana jest nowa strona w CMS, sesja po stronie serwera i zegar JavaScript są resetowane. Prosty i elegancki. Jeśli użytkownik pozostaje na jednej stronie przez ponad 180 minut, to na pierwszym miejscu wydaje mi się, że coś jest nie tak.
źródło
Czysty JavaScript z odpowiednio ustawionym czasem resetowania i powiązaniami za pośrednictwem
addEventListener
źródło
(Częściowo zainspirowany dobrą podstawową logiką Equimana wcześniej w tym wątku.)
sessionExpiration.js
sessionExpiration.js jest lekki, ale skuteczny i konfigurowalny. Po wdrożeniu użyj w jednym rzędzie:
To jest przykład tego, jak to wygląda w akcji, jeśli nie zmienisz CSS.
źródło
Napisałem prostą wtyczkę jQuery, która zrobi to, czego szukasz.
https://github.com/afklondon/jquery.inactivity
Skrypt będzie nasłuchiwał nieaktywności myszy, klawiatury, dotyku i innych niestandardowych zdarzeń (bezczynności) oraz wyzwalał globalne zdarzenia „aktywności” i „braku aktywności”.
Mam nadzieję że to pomoże :)
źródło
Tylko kilka myśli, aleja lub dwie do odkrycia.
Czy możliwe jest uruchamianie funkcji co 10 sekund i sprawdzanie zmiennej „licznik”? Jeśli to możliwe, możesz najechać kursorem myszy na stronę, prawda? Jeśli tak, użyj zdarzenia mouseover, aby zresetować zmienną „counter”. Jeśli twoja funkcja jest wywoływana, a licznik znajduje się powyżej zakresu, który wcześniej ustaliłeś, zrób to.
Ponownie, tylko kilka myśli ... Mam nadzieję, że to pomaga.
źródło
Przetestowałem ten plik roboczy kodu:
źródło
Oto najlepsze rozwiązanie, jakie znalazłem: http://css-tricks.com/snippets/jquery/fire-event-when-user-is-idle/
Oto JS:
źródło
Możesz użyć niżej wymienionego rozwiązania
źródło
Korzystam z tego podejścia, ponieważ nie trzeba ciągle resetować czasu, w którym wydarzenie się uruchamia, zamiast tego rejestrujemy tylko czas, co generuje bezczynny punkt początkowy.
źródło
Prawdopodobnie możesz wykryć brak aktywności na swojej stronie internetowej, korzystając z podanych sztuczek myszy, ale to nie powie, że użytkownika nie ma na innej stronie w innym oknie lub karcie, lub że jest on w programie Word lub Photoshop lub WOW i po prostu nie patrzy teraz na twoją stronę. Generalnie po prostu wykonuję pobieranie wstępne i polegam na wielozadaniowości klienta. Jeśli naprawdę potrzebujesz tej funkcji, robisz coś z kontrolką ActiveX w systemie Windows, ale w najlepszym razie jest brzydka.
źródło
Oto usługa AngularJS do realizacji w Angular.
Pamiętaj, że ten kontroler bezczynności będzie działał na wszystkich trasach, dlatego należy go zainicjować
.run()
po załadowaniu aplikacji kątowej. Następnie możesz korzystać zidleChecker.secondsIdle
każdej trasy.źródło
Zapowiedź naprawdę świetny pomysł! Oto wersja dla darmowych projektów jQuery:
źródło
Tak proste, jak to tylko możliwe, wykrywaj tylko ruchy myszy:
źródło
Cóż, możesz dołączyć zdarzenie kliknięcia lub przesunięcia myszy do treści dokumentu, która resetuje stoper. Mieć funkcję, którą wywołujesz w odstępach czasowych, która sprawdza, czy czas przekroczył określony czas (np. 1000 milis) i rozpoczyna wstępne ładowanie.
źródło
JavaScript nie ma sposobu na określenie wykorzystania procesora. Spowodowałoby to uszkodzenie javascript w piaskownicy.
Poza tym zaczepienie zdarzeń onmouseover i onkeydown strony prawdopodobnie działałoby.
Można również ustawić użycie setTimeout w zdarzeniu onload, aby zaplanować funkcję, która będzie wywoływana z opóźnieniem.
źródło