É possível detectar " inativo " " no JavaScript?
Meu caso de uso principal provavelmente seria pré-buscar ou pré-carregar o conteúdo.
Tempo ocioso: período de inatividade do usuário ou sem uso da CPU
javascript
Cherian
fonte
fonte
Respostas:
Aqui está um script simples usando JQuery que lida com eventos de remoção de teclado e pressionamento de tecla. Se o tempo expirar, a página será recarregada.
fonte
setInterval
, que é avaliada como JavaScript.idleTime++;
vez deidleTime = idleTime + 1;
'mousemove keydown click'
usam cadeias de caracteres, como o uso de sinalizadores de bit (Event.MOUSEMOVE | Event.KEYDOWN | Event.CLICK
), pois são muito mais rápidas que as operações de cadeia de caracteres. Mas você realmente quer fazer isso?Sem usar o jQuery, apenas JavaScript baunilha:
E inicie a função onde você precisar (por exemplo: onPageLoad).
Você pode adicionar mais eventos DOM, se necessário. Os mais usados são:
Ou registre os eventos desejados usando uma matriz
Lista de eventos do DOM : http://www.w3schools.com/jsref/dom_obj_event.asp
Lembre-se de usar
window
ou dedocument
acordo com suas necessidades. Aqui você pode ver as diferenças entre eles: Qual é a diferença entre janela, tela e documento em Javascript?O código atualizado com @ frank-conijn e @daxchen aprimoram:
window.onscroll
não será acionado se a rolagem estiver dentro de um elemento rolável, porque os eventos de rolagem não borbulham.window.addEventListener('scroll', resetTimer, true)
, o terceiro argumento informa ao ouvinte para capturar o evento durante a fase de captura em vez da fase de bolha.fonte
document.onload = function () { inactivityTime(); }; document.onmousedown = function () { inactivityTime(); }; document.onkeypress = function () { inactivityTime(); }; document.ontouchstart = function () { inactivityTime(); };
Melhorando a resposta de Equiman:
.
Além das melhorias relacionadas à detecção de atividades e à mudança de
document
parawindow
, esse script realmente chama a função, em vez de deixá-la ociosa.Ele não captura o uso zero da CPU diretamente, mas isso é impossível, porque a execução de uma função causa o uso da CPU. E a inatividade do usuário acaba levando a zero uso da CPU; portanto, indiretamente, ele captura zero uso da CPU.
fonte
window.onscroll
não será acionado se a rolagem estiver dentro de um elemento rolável, porque os eventos de rolagem não borbulham. Usandowindow.addEventListener('scroll', resetTimer, true)
, o terceiro argumento diz ao ouvinte para o evento capturas durantecapture
fase em vez debubble
fase (IE> 8), veja esta respostadocument.onscroll
tem o mesmo problema, não dispara se a rolagem estiver dentro de um filho rolável?addEventListener
vez deonscroll
.Eu criei uma pequena lib que faz isso há um ano:
https://github.com/shawnmclean/Idle.js
Descrição:
Os usuários do Visual Studio podem obtê-lo no NuGet:
PM> Install-Package Idle.js
fonte
Aqui está uma implementação aproximada do jQuery da ideia de tvanfosson:
fonte
setInterval
uma corda! Apenas dê uma função como uma variável!setInterval()
avaliar a expressão no escopo global e, portanto, não encontrará atimerIncrement()
função que está dentro da função manipulador .ready. Esse é mais um motivo para NUNCA passar as stringssetInterval()
. Basta passar uma referência de função real e você não terá esse problema porque eles são avaliados no escopo atual.Semelhante à solução da Iconic acima (com evento personalizado jQuery) ...
fonte
Você pode fazer isso de forma mais elegante com sublinhado e jquery -
fonte
Minha resposta foi inspirada na resposta de vijay , mas é uma solução mais curta e geral que pensei em compartilhar para qualquer pessoa que pudesse ajudar.
Como está atualmente, esse código será executado imediatamente e recarregará sua página atual após 3 minutos sem nenhum movimento do mouse ou pressionamento de tecla.
Isso utiliza JavaScript simples e uma expressão de função chamada imediatamente para lidar com tempos limite inativos de maneira limpa e independente.
fonte
onclick
tarefa, pois provavelmente não é necessário além dissoonmousemove
, mas obviamente qualquer um desses eventos acionados programaticamente continuará sendo redefinidoidleCounter
. Não sei por que você simularia a interação do usuário em vez de apenas chamar uma função, mas se for algo que precisa fazer por algum motivo, essa resposta obviamente não funcionará para você, nem a maioria das outras respostas. Eu olhei para esta questão.Sei que é uma pergunta relativamente antiga, mas tive o mesmo problema e encontrei uma solução muito boa.
Eu usei: jquery.idle e só precisava fazer:
Veja a demonstração do JsFiddle .
(Apenas para informações: veja isso para rastreamento de eventos de back-end Leads load do navegador )
fonte
keepTracking
opção parafalse
. Se você deseja redefinir, você pode tentar reinicializar. Aqui está um exemplo modificado que seriaTodas as respostas anteriores têm um manipulador de ratoeiras sempre ativo. Se o manipulador for jQuery, o processamento adicional que o jQuery executa pode ser adicionado. Especialmente se o usuário estiver usando um mouse para jogos, podem ocorrer até 500 eventos por segundo.
Esta solução evita o manuseio de todos os eventos do mouse. Isso resulta em um pequeno erro de tempo, mas que você pode ajustar à sua necessidade.
http://jsfiddle.net/jndxq51o/
fonte
$(startTimer)
que equivale a$(document).ready(startTimer)
, garante que o DOM está pronto antes de ligar o mousemove e eventos keypress.Você provavelmente poderia hackear algo ao detectar o movimento do mouse no corpo do formulário e atualizar uma variável global com a última hora do movimento. Você precisaria então ter um temporizador de intervalo em funcionamento que verifique periodicamente o último tempo de movimento e faça alguma coisa se já tiver sido suficientemente longo desde que o último movimento do mouse foi detectado.
fonte
Eu escrevi uma pequena classe ES6 para detectar atividades e acionar eventos em tempo limite ocioso. Ele cobre teclado, mouse e toque , pode ser ativado e desativado e possui uma API muito enxuta:
Ele não depende do jQuery, embora seja necessário executá-lo no Babel para oferecer suporte a navegadores mais antigos.
https://gist.github.com/4547ef5718fd2d31e5cdcafef0208096
Posso liberá-lo como um pacote npm assim que receber algum feedback.
fonte
Se você estiver direcionando um navegador suportado (Chrome ou Firefox em dezembro de 2018), poderá experimentar o requestIdleCallback e incluir o shim requestIdleCallback para navegadores não suportados.
fonte
Experimente este código, ele funciona perfeitamente.
fonte
Eu acho que esse código jquery é perfeito, apesar de copiado e modificado das respostas acima !! Não esqueça de incluir a biblioteca jquery no seu arquivo!
fonte
O problema com todas essas soluções, apesar de corretas, é impraticável ao levar em consideração o conjunto valioso de tempo limite da sessão, usando PHP, .NET ou no arquivo Application.cfc para desenvolvedores do Coldfusion. O tempo definido pela solução acima precisa sincronizar com o tempo limite da sessão no servidor. Se os dois não sincronizarem, você poderá encontrar problemas que apenas frustram e confundem seus usuários. Por exemplo, o tempo limite da sessão no servidor pode ser definido como 60 minutos, mas o usuário pode acreditar que está seguro, porque a captura de tempo ocioso do JavaScript aumentou a quantidade total de tempo que um usuário pode gastar em uma única página. O usuário pode ter passado algum tempo preenchendo um formulário longo e depois enviá-lo. O tempo limite da sessão pode ocorrer antes que o envio do formulário seja processado. Costumo dar aos meus usuários 180 minutos, e use o JavaScript para desconectar automaticamente o usuário. Essencialmente, usando parte do código acima, para criar um timer simples, mas sem a parte do evento de captura do mouse. Dessa maneira, meu horário do lado do cliente e do servidor é sincronizado perfeitamente. Não há confusão, se você mostrar o tempo para o usuário na sua interface do usuário, pois ele reduz. Sempre que uma nova página é acessada no CMS, a sessão do servidor e o timer JavaScript são redefinidos. Simples e elegante. Se um usuário permanecer em uma única página por mais de 180 minutos, acho que há algo errado com a página, em primeiro lugar. como reduz. Sempre que uma nova página é acessada no CMS, a sessão do servidor e o timer JavaScript são redefinidos. Simples e elegante. Se um usuário permanecer em uma única página por mais de 180 minutos, acho que há algo errado com a página, em primeiro lugar. como reduz. Sempre que uma nova página é acessada no CMS, a sessão do servidor e o timer JavaScript são redefinidos. Simples e elegante. Se um usuário permanecer em uma única página por mais de 180 minutos, acho que há algo errado com a página, em primeiro lugar.
fonte
JavaScript puro com tempo de redefinição e ligações adequadamente configurados via
addEventListener
fonte
(Parcialmente inspirado na boa lógica central de Equiman, anteriormente neste tópico.)
sessionExpiration.js
sessionExpiration.js é leve, mas eficaz e personalizável. Uma vez implementado, use em apenas uma linha:
Este é um exemplo de como fica em ação, se você não alterar o CSS.
fonte
Eu escrevi um plugin jQuery simples que fará o que você está procurando.
https://github.com/afklondon/jquery.inactivity
O script escutará o mouse, teclado, toque e outros eventos personalizados inativos (inativos) e acionará eventos globais de "atividade" e "inatividade".
Espero que isto ajude :)
fonte
Apenas alguns pensamentos, uma avenida ou duas para explorar.
É possível executar uma função a cada 10 segundos e verificar essa variável "counter"? Se isso for possível, você pode passar o mouse sobre a página, não é? Nesse caso, use o evento mouseover para redefinir a variável "counter". Se sua função for chamada e o contador estiver acima do intervalo que você pré-determina, faça sua ação.
Mais uma vez, apenas alguns pensamentos ... Espero que ajude.
fonte
Eu testei este arquivo de trabalho de código:
fonte
Aqui está a melhor solução que encontrei: http://css-tricks.com/snippets/jquery/fire-event-when-user-is-idle/
Aqui está o JS:
fonte
Você pode usar a solução abaixo mencionada
fonte
Eu uso essa abordagem, já que você não precisa redefinir constantemente o horário em que um evento é disparado; em vez disso, apenas gravamos o horário, isso gera o ponto inicial ocioso.
fonte
Provavelmente, você pode detectar inatividade em sua página da web usando os truques de remoção de rato listados, mas isso não informa que o usuário não está em outra página em outra janela ou guia, ou que está no Word ou Photoshop, ou WOW e no momento não está visualizando sua página. Geralmente, eu apenas fazia a pré-busca e confiava nas multitarefas do cliente. Se você realmente precisar dessa funcionalidade, faça algo com um controle activex no Windows, mas é feio na melhor das hipóteses.
fonte
Aqui está um serviço AngularJS para realizar em Angular.
Lembre-se de que esse verificador inativo será executado em todas as rotas; portanto, ele deve ser inicializado no
.run()
carregamento do aplicativo angular. Então você pode usaridleChecker.secondsIdle
dentro de cada rota.fonte
Debounce realmente uma ótima idéia! Aqui versão para projetos livres do jQuery:
fonte
Tão simples quanto possível, detecte quando o mouse se move apenas:
fonte
Bem, você pode anexar um evento de clique ou remoção do mouse ao corpo do documento que redefine um timer. Tenha uma função que você chama em intervalos de tempo que verifica se o cronômetro está acima de um tempo especificado (como 1000 milis) e inicia sua pré-carga.
fonte
Javascript não tem como saber o uso da CPU. Isso quebraria o javascript da sandbox executado dentro.
Fora isso, conectar os eventos onmouseover e onkeydown da página provavelmente funcionaria.
Você também pode definir o uso de setTimeout no evento onload para agendar uma função a ser chamada após um atraso.
fonte