Можно ли обнаружить « простой » в JavaScript?
Моим основным вариантом использования, вероятно, будет предварительная загрузка или предварительная загрузка контента.
Время простоя: период бездействия пользователя или без использования процессора
javascript
Cherian
источник
источник
Ответы:
Вот простой скрипт, использующий JQuery, который обрабатывает события мыши и нажатия клавиш. Если время истекло, страница перезагрузится.
источник
setInterval
, которая затем оценивается как JavaScript.idleTime++;
вместоidleTime = idleTime + 1;
'mousemove keydown click'
использовать битовые флаги (Event.MOUSEMOVE | Event.KEYDOWN | Event.CLICK
), так как они выполняются быстрее, чем строковые операции. Но вы действительно хотите это сделать?Без использования jQuery, только ванильный JavaScript:
И инициируйте функцию там, где она вам нужна (например: onPageLoad).
Вы можете добавить больше событий DOM, если вам нужно. Наиболее используемые:
Или зарегистрируйте нужные события, используя массив
Список событий DOM : http://www.w3schools.com/jsref/dom_obj_event.asp
Помните, используйте
window
илиdocument
соответствии с вашими потребностями. Здесь вы можете увидеть различия между ними: В чем разница между окном, экраном и документом в Javascript?Код, обновленный с помощью @ frank-conijn и @daxchen, улучшается:
window.onscroll
не будет срабатывать, если прокрутка внутри прокручиваемого элемента, потому что события прокрутки не всплывают.window.addEventListener('scroll', resetTimer, true)
третий аргумент говорит слушателю перехватывать событие во время фазы захвата вместо фазы пузыря.источник
document.onload = function () { inactivityTime(); }; document.onmousedown = function () { inactivityTime(); }; document.onkeypress = function () { inactivityTime(); }; document.ontouchstart = function () { inactivityTime(); };
Улучшение ответа Эквимана:
,
Помимо улучшений, связанных с обнаружением активности и переходом от
document
кwindow
, этот скрипт фактически вызывает функцию, а не позволяет ей бездействовать.Он не улавливает нулевую загрузку процессора напрямую, но это невозможно, потому что выполнение функции вызывает загрузку процессора. А неактивность пользователя в конечном итоге приводит к нулевой загрузке ЦП, поэтому косвенно она отлавливает нулевую загрузку ЦП.
источник
window.onscroll
не будет срабатывать, если прокрутка внутри прокручиваемого элемента, потому что события прокрутки не всплывают. Используяwindow.addEventListener('scroll', resetTimer, true)
, третий аргумент говорит слушателю перехватывать событие во времяcapture
фазы вместоbubble
фазы (IE> 8), посмотрите этот ответdocument.onscroll
нет той же проблемы, не стреляя, если прокрутка находится внутри прокручиваемого потомка?addEventListener
вместоonscroll
.Я создал небольшую библиотеку, которая делает это год назад:
https://github.com/shawnmclean/Idle.js
Описание:
Пользователи Visual Studio могут получить его из NuGet:
PM> Install-Package Idle.js
источник
Вот примерная реализация идеи tvanfosson для jQuery:
источник
setInterval
строку! Просто дайте функцию в качестве переменной!setInterval()
оценки выражения в глобальной области видимости и, следовательно, она не найдетtimerIncrement()
функцию, которая находится внутри функции обработчика .ready. Это еще одна причина НИКОГДА не передавать строкиsetInterval()
. Просто передайте реальную ссылку на функцию, и у вас не возникнет этой проблемы, потому что они оцениваются в текущей области.Аналогично решению Iconic выше (с пользовательским событием jQuery) ...
источник
Вы можете сделать это более элегантно с подчеркиванием и JQuery -
источник
Мой ответ был вдохновлен ответом Виджая , но это более короткое, более общее решение, которым я поделился с кем-нибудь, кому это могло бы помочь.
В настоящее время этот код будет выполняться немедленно и перезагрузит текущую страницу через 3 минуты без движения мыши или нажатия клавиш.
При этом используется простой ванильный JavaScript и незамедлительно вызываемое функциональное выражение для чистой и автономной обработки тайм-аутов простоя.
источник
onclick
назначение, так как оно, вероятно, не нужно в дополнение кonmousemove
, но, очевидно, любое из этих событий, которые запускаются программно, продолжит сбрасыватьсяidleCounter
. Я не уверен, почему вы должны имитировать взаимодействие с пользователем, а не просто вызывать функцию, но если по какой-то причине вам нужно что-то сделать, этот ответ, очевидно, не подойдет вам, как и большинство других ответов, которые я Мы смотрели на этот вопрос.Я знаю, это довольно старый вопрос, но у меня была та же проблема, и я нашел довольно хорошее решение.
Я использовал: jquery.idle и мне нужно было только сделать:
Смотрите демоверсию JsFiddle .
(Только для информации: см. Это для внутреннего отслеживания событий приводит к загрузке браузера )
источник
keepTracking
опцию наfalse
. Если вы хотите сбросить настройки, попробуйте выполнить повторную инициализацию. Вот модифицированный пример, который будет запускатьсяВсе предыдущие ответы имеют всегда активный обработчик перемещения мыши. Если обработчиком является jQuery, дополнительная обработка, которую выполняет jQuery, может сложиться. Особенно, если пользователь использует игровую мышь, может происходить до 500 событий в секунду.
Это решение позволяет избежать обработки каждого события мыши. Это приводит к небольшой ошибке синхронизации, но вы можете настроить ее по своему усмотрению.
http://jsfiddle.net/jndxq51o/
источник
$(startTimer)
Эквивалентно$(document).ready(startTimer)
, гарантирует , что DOM готова , прежде чем подключить MouseMove и события нажатия клавиш.Вероятно, вы могли бы что-то взломать, обнаружив движение мыши по телу формы и обновив глобальную переменную с учетом времени последнего перемещения. Затем вам потребуется запустить интервальный таймер, который периодически проверяет время последнего движения и что-то делает, если оно прошло достаточно долго с момента обнаружения последнего движения мыши.
источник
Я написал небольшой класс ES6 для обнаружения активности и запуска событий на время простоя. Он охватывает клавиатуру, мышь и сенсорный экран , может быть активирован и деактивирован и имеет очень тонкий API:
Это не зависит от jQuery, хотя вам может понадобиться запустить его через Babel для поддержки старых браузеров.
https://gist.github.com/4547ef5718fd2d31e5cdcafef0208096
Я мог бы выпустить его как пакет npm, как только получу обратную связь.
источник
Если вы ориентируетесь на поддерживаемый браузер (Chrome или Firefox по состоянию на декабрь 2018 года), вы можете поэкспериментировать с requestIdleCallback и включить прокладку requestIdleCallback для неподдерживаемых браузеров.
источник
Попробуйте этот код, он работает отлично.
источник
Я думаю, что этот код JQuery является идеальным, хотя скопированы и изменены сверху ответы! Донот забыл включить библиотеку jquery в ваш файл!
источник
Проблема со всеми этими решениями, хотя и правильная, но она нецелесообразна, если принять во внимание ценный набор времени ожидания сеанса, используя PHP, .NET или в файле Application.cfc для разработчиков Coldfusion. Время, установленное вышеупомянутым решением, должно синхронизироваться с тайм-аутом сеанса на стороне сервера. Если они не синхронизируются, вы можете столкнуться с проблемами, которые просто разочаруют и запутают ваших пользователей. Например, время ожидания сеанса на стороне сервера может быть установлено равным 60 минутам, но пользователь может полагать, что он / она безопасен, поскольку захват времени простоя JavaScript увеличил общее количество времени, которое пользователь может провести на одной странице. Пользователь, возможно, провел время, заполняя длинную форму, а затем отправляет ее. Тайм-аут сеанса может наступить до обработки отправки формы. Я стараюсь дать своим пользователям 180 минут, а затем использовать JavaScript для автоматического выхода пользователя из системы. По сути, используя некоторый код выше, чтобы создать простой таймер, но без захвата части события мыши. Таким образом, время на стороне клиента и сервера отлично синхронизируется. Не возникает путаницы, если вы показываете время пользователю в своем пользовательском интерфейсе, так как оно сокращается. Каждый раз, когда в CMS осуществляется доступ к новой странице, сеанс на стороне сервера и таймер JavaScript сбрасываются. Просто и элегантно. Если пользователь остается на одной странице более 180 минут, я считаю, что, во-первых, что-то не так с этой страницей. как это уменьшает. Каждый раз, когда в CMS осуществляется доступ к новой странице, сеанс на стороне сервера и таймер JavaScript сбрасываются. Просто и элегантно. Если пользователь остается на одной странице более 180 минут, я считаю, что, во-первых, что-то не так с этой страницей. как это уменьшает. Каждый раз, когда в CMS осуществляется доступ к новой странице, сеанс на стороне сервера и таймер JavaScript сбрасываются. Просто и элегантно. Если пользователь остается на одной странице более 180 минут, я считаю, что, во-первых, что-то не так с этой страницей.
источник
Чистый JavaScript с правильно установленным временем сброса и привязками через
addEventListener
источник
(Частично вдохновлен хорошей базовой логикой Equiman ранее в этой теме.)
sessionExpiration.js
sessionExpiration.js является легким, но эффективным и настраиваемым. После внедрения используйте только одну строку:
Это пример того, как это выглядит в действии, если вы не измените CSS.
источник
Я написал простой плагин jQuery, который будет делать то, что вы ищете.
https://github.com/afklondon/jquery.inactivity
Скрипт будет прослушивать мышь, клавиатуру, сенсорный экран и другие пользовательские события бездействия (бездействия) и запускать глобальные события «активность» и «бездействие».
Надеюсь это поможет :)
источник
Всего несколько мыслей, проспект или два для изучения.
Можно ли запускать функцию каждые 10 секунд и проверять переменную «счетчик»? Если это возможно, вы можете навести курсор мыши на страницу, не так ли? Если это так, используйте событие mouseover для сброса переменной «counter». Если ваша функция вызывается, а счетчик находится выше предопределенного диапазона, выполните свое действие.
Опять же, только некоторые мысли ... Надеюсь, это поможет.
источник
Я проверил этот код рабочий файл:
источник
Вот лучшее решение, которое я нашел: http://css-tricks.com/snippets/jquery/fire-event-when-user-is-idle/
Вот JS:
источник
Вы можете использовать нижеупомянутое решение
источник
Я использую этот подход, поскольку вам не нужно постоянно сбрасывать время, когда происходит событие, вместо этого мы просто записываем время, это генерирует начальную точку холостого хода.
источник
Вы могли бы, вероятно, обнаружить неактивность на своей веб-странице, используя перечисленные приемы перемещения мышью, но это не скажет вам, что пользователь не находится на другой странице в другом окне или вкладке, или что пользователь находится в Word или Photoshop, или WOW и просто не смотрит на вашу страницу в это время. Обычно я просто делаю предварительную выборку и полагаюсь на многозадачность клиента. Если вам действительно нужна эта функциональность, вы делаете что-то с помощью элемента управления ActiveX в Windows, но в лучшем случае это уродливо.
источник
Вот сервис AngularJS для выполнения в Angular.
Имейте в виду, что эта программа проверки на холостом ходу будет работать для всех маршрутов, поэтому ее следует инициализировать при
.run()
загрузке углового приложения. Тогда вы можете использоватьidleChecker.secondsIdle
внутри каждого маршрута.источник
Дебад на самом деле отличная идея! Вот версия для бесплатных проектов jQuery:
источник
Как можно проще определить, только когда мышь двигается:
источник
Хорошо, вы можете прикрепить событие click или mousemove к телу документа, которое сбрасывает таймер. Имейте функцию, которую вы вызываете через определенные промежутки времени, которая проверяет, превышает ли таймер указанное время (например, 1000 миллисекунд), и начинайте предварительную загрузку.
источник
У Javascript нет способа сообщить об использовании процессора. Это нарушит работу javascript в песочнице.
Кроме этого, перехват событий onmouseover и onkeydown страницы, вероятно, будет работать.
Вы также можете установить использование setTimeout в событии onload, чтобы запланировать функцию, вызываемую после задержки.
источник