Apakah mungkin mendeteksi waktu " idle " dalam JavaScript?
Kasing penggunaan utama saya mungkin adalah untuk mengambil atau mengambil pramuat konten.
Waktu idle: Periode tanpa aktivitas pengguna atau tanpa penggunaan CPU
javascript
Cherian
sumber
sumber
Jawaban:
Berikut ini adalah skrip sederhana menggunakan JQuery yang menangani acara mousemove dan penekanan tombol. Jika waktu habis, halaman akan dimuat ulang.
sumber
setInterval
, yang kemudian dievaluasi sebagai JavaScript.idleTime++;
sajaidleTime = idleTime + 1;
'mousemove keydown click'
menggunakan flag bit (Event.MOUSEMOVE | Event.KEYDOWN | Event.CLICK
), karena mereka waaaaay lebih cepat daripada operasi string. Tetapi apakah Anda benar - benar ingin melakukan ini?Tanpa menggunakan jQuery, hanya JavaScript vanilla:
Dan init fungsi di mana Anda membutuhkannya (misalnya: onPageLoad).
Anda dapat menambahkan lebih banyak acara DOM jika perlu. Paling sering digunakan adalah:
Atau daftarkan acara yang diinginkan menggunakan array
Daftar Acara DOM : http://www.w3schools.com/jsref/dom_obj_event.asp
Ingat gunakan
window
, ataudocument
sesuai kebutuhan Anda. Di sini Anda dapat melihat perbedaan di antara mereka: Apa perbedaan antara jendela, layar, dan dokumen dalam Javascript?Kode Diperbarui dengan @ frank-conijn dan @daxchen meningkatkan:
window.onscroll
tidak akan menyala jika bergulir di dalam elemen yang dapat digulir, karena acara gulir tidak menggelembung.window.addEventListener('scroll', resetTimer, true)
, argumen ketiga memberitahu pendengar untuk menangkap acara selama fase penangkapan alih-alih fase gelembung.sumber
document.onload = function () { inactivityTime(); }; document.onmousedown = function () { inactivityTime(); }; document.onkeypress = function () { inactivityTime(); }; document.ontouchstart = function () { inactivityTime(); };
Memperbaiki jawaban Equiman:
.
Terlepas dari perbaikan mengenai deteksi aktivitas, dan perubahan dari
document
menjadiwindow
, skrip ini sebenarnya memanggil fungsi, daripada membiarkannya diam.Tidak menangkap nol penggunaan CPU secara langsung, tetapi itu tidak mungkin, karena menjalankan fungsi menyebabkan penggunaan CPU. Dan ketidakaktifan pengguna akhirnya mengarah ke nol penggunaan CPU, jadi secara tidak langsung itu menangkap penggunaan nol CPU.
sumber
window.onscroll
tidak akan menyala jika pengguliran ada di dalam elemen yang dapat digulir, karena acara gulir tidak menggelembung. Dengan menggunakanwindow.addEventListener('scroll', resetTimer, true)
, argumen ketiga memberi tahu pendengar untuk menangkap peristiwa selamacapture
fase alih-alihbubble
fase (IE> 8), lihat jawaban inidocument.onscroll
memiliki masalah yang sama, tidak memecat jika gulir di dalam anak digulir?addEventListener
alih-alihonscroll
.Saya telah membuat lib kecil yang melakukan ini setahun yang lalu:
https://github.com/shawnmclean/Idle.js
Deskripsi:
Pengguna Visual Studio bisa mendapatkannya dari NuGet dengan:
PM> Install-Package Idle.js
sumber
Berikut ini adalah implementasi jQuery dari ide tvanfosson:
sumber
setInterval
string! Berikan saja fungsi sebagai variabel!setInterval()
mengevaluasi ekspresi dalam lingkup global dan karenanya tidak akan menemukantimerIncrement()
fungsi yang ada di dalam fungsi. Ini adalah alasan lain untuk TIDAK PERNAH meneruskan stringsetInterval()
. Cukup berikan referensi fungsi aktual dan Anda tidak akan mengalami masalah ini karena mereka dievaluasi dalam cakupan saat ini.Mirip dengan solusi Iconic di atas (dengan acara khusus jQuery) ...
sumber
Anda dapat melakukannya dengan lebih elegan dengan garis bawah dan jquery -
sumber
Jawaban saya terinspirasi oleh jawaban vijay , tetapi merupakan solusi yang lebih singkat dan lebih umum yang saya pikir akan saya bagikan kepada siapa pun yang mungkin bisa membantu.
Seperti saat ini berdiri, kode ini akan segera mengeksekusi dan memuat kembali halaman Anda saat ini setelah 3 menit tanpa gerakan mouse atau penekanan tombol.
Ini menggunakan JavaScript vanilla polos dan ekspresi fungsi yang segera dipanggil untuk menangani waktu tunggu idle dengan cara yang bersih dan mandiri.
sumber
onclick
tugas karena mungkin tidak perlu sebagai tambahanonmousemove
, tapi jelas semua peristiwa yang dipicu secara terprogram akan terus diatur ulangidleCounter
. Saya tidak yakin mengapa Anda mensimulasikan interaksi pengguna alih-alih hanya memanggil fungsi, tetapi jika itu sesuatu yang perlu Anda lakukan untuk beberapa alasan, jawaban ini jelas tidak akan bekerja untuk Anda, dan sebagian besar dari jawaban lainnya tidak akan saya jawab. Saya telah melihat pertanyaan ini.Saya tahu itu pertanyaan yang relatif lama, tetapi saya memiliki masalah yang sama dan saya menemukan solusi yang cukup bagus.
Saya menggunakan: jquery.idle dan saya hanya perlu melakukan:
Lihat demo JsFiddle .
(Hanya untuk Info: lihat ini untuk pelacakan acara back-end browser Leads )
sumber
keepTracking
opsi kefalse
. Jika Anda ingin mengatur ulang Anda bisa mencoba untuk menginisialisasi ulang. Berikut ini adalah contoh yang dimodifikasi yang hanya akan diaktifkan sekali: jsfiddle.net/f238hchm/12Semua jawaban sebelumnya memiliki penangan mouse yang selalu aktif. Jika pawang adalah jQuery, kinerja pemrosesan jQuery tambahan dapat bertambah. Terutama jika pengguna menggunakan mouse gaming, sebanyak 500 peristiwa per detik dapat terjadi.
Solusi ini menghindari penanganan setiap acara mousemove. Ini menghasilkan kesalahan waktu yang kecil, tetapi Anda dapat menyesuaikannya dengan kebutuhan Anda.
http://jsfiddle.net/jndxq51o/
sumber
$(startTimer)
setara dengan$(document).ready(startTimer)
, memastikan bahwa DOM siap sebelum Anda mengaitkan mousemove dan acara menekan tombol.Anda mungkin dapat meretas sesuatu bersama-sama dengan mendeteksi gerakan mouse di badan formulir dan memperbarui variabel global dengan waktu gerakan terakhir. Anda kemudian perlu menjalankan timer interval yang secara berkala memeriksa waktu gerakan terakhir dan melakukan sesuatu jika sudah cukup lama sejak gerakan mouse terakhir terdeteksi.
sumber
Saya menulis kelas ES6 kecil untuk mendeteksi aktivitas dan memecat acara saat idle timeout. Ini mencakup keyboard, mouse, dan sentuhan , dapat diaktifkan dan dinonaktifkan dan memiliki API yang sangat ramping:
Itu tidak tergantung pada jQuery, meskipun Anda mungkin perlu menjalankannya melalui Babel untuk mendukung browser yang lebih lama.
https://gist.github.com/4547ef5718fd2d31e5cdcafef0208096
Saya mungkin merilisnya sebagai paket npm setelah saya mendapatkan umpan balik.
sumber
Jika Anda menargetkan browser yang didukung (Chrome atau Firefox pada Desember 2018), Anda dapat bereksperimen dengan requestIdleCallback dan memasukkan shim requestIdleCallback untuk browser yang tidak didukung.
sumber
Coba kode ini, ini berfungsi dengan sempurna.
sumber
Saya pikir kode jquery ini sempurna, walaupun disalin dan dimodifikasi dari jawaban di atas !! jangan lupa untuk memasukkan pustaka jquery dalam file Anda!
sumber
Masalah dengan semua solusi ini, meskipun benar, mereka tidak praktis, ketika mempertimbangkan set timeout sesi berharga, menggunakan PHP, .NET atau dalam file Application.cfc untuk pengembang Coldfusion. Waktu yang ditentukan oleh solusi di atas perlu disinkronkan dengan batas waktu sesi sisi server. Jika keduanya tidak disinkronkan, Anda dapat mengalami masalah yang hanya akan membuat frustasi dan membingungkan pengguna Anda. Misalnya, batas waktu sesi sisi server mungkin diatur ke 60 menit, tetapi pengguna mungkin percaya bahwa ia aman, karena penangkapan waktu JavaScript yang tidak aktif telah meningkatkan jumlah total waktu yang dapat dihabiskan pengguna pada satu halaman. Pengguna mungkin telah menghabiskan waktu mengisi formulir yang panjang, dan kemudian mengirimkannya. Batas waktu sesi mungkin muncul sebelum pengiriman formulir diproses. Saya cenderung hanya memberi pengguna saya 180 menit, dan kemudian menggunakan JavaScript untuk secara otomatis mengeluarkan pengguna. Pada dasarnya, menggunakan beberapa kode di atas, untuk membuat penghitung waktu yang sederhana, tetapi tanpa menangkap bagian acara mouse. Dengan cara ini sisi klien saya & waktu sisi server disinkronkan dengan sempurna. Tidak ada kebingungan, jika Anda menunjukkan waktu kepada pengguna di UI Anda, karena mengurangi. Setiap kali halaman baru diakses di CMS, sesi sisi server & pengatur waktu JavaScript direset. Sederhana & elegan. Jika pengguna tetap berada di satu halaman selama lebih dari 180 menit, saya pikir ada sesuatu yang salah dengan halaman tersebut. karena mengurangi. Setiap kali halaman baru diakses di CMS, sesi sisi server & pengatur waktu JavaScript direset. Sederhana & elegan. Jika pengguna tetap berada di satu halaman selama lebih dari 180 menit, saya pikir ada sesuatu yang salah dengan halaman tersebut. karena mengurangi. Setiap kali halaman baru diakses di CMS, sesi sisi server & pengatur waktu JavaScript direset. Sederhana & elegan. Jika pengguna tetap berada di satu halaman selama lebih dari 180 menit, saya pikir ada sesuatu yang salah dengan halaman tersebut.
sumber
JavaScript murni dengan waktu reset dan binding yang diatur dengan benar
addEventListener
sumber
(Sebagian terinspirasi oleh logika inti yang baik dari Equiman sebelumnya di utas ini.)
sessionExpiration.js
sessionExpiration.js ringan namun efektif dan dapat disesuaikan. Setelah diimplementasikan, gunakan hanya dalam satu baris:
Ini adalah contoh dari apa yang terlihat dalam tindakan, jika Anda tidak mengubah CSS.
sumber
Saya menulis plugin jQuery sederhana yang akan melakukan apa yang Anda cari.
https://github.com/afklondon/jquery.inactivity
Script akan mendengarkan mouse, keyboard, touch, dan aktivitas tidak aktif lainnya (idle) dan menjalankan "aktivitas" global dan "aktivitas" tidak aktif.
Semoga ini membantu :)
sumber
Hanya beberapa pemikiran, satu atau dua jalan untuk dijelajahi.
Apakah mungkin menjalankan fungsi setiap 10 detik, dan memeriksanya sebagai variabel "penghitung"? Jika itu memungkinkan, Anda dapat memiliki mouseover untuk halaman tersebut, bukan? Jika demikian, gunakan event mouseover untuk mereset variabel "counter". Jika fungsi Anda dipanggil, dan penghitung berada di atas rentang yang Anda tentukan sebelumnya, maka lakukan tindakan Anda.
Sekali lagi, hanya beberapa pemikiran ... Semoga ini bisa membantu.
sumber
Saya telah menguji file kode ini:
sumber
Inilah solusi terbaik yang saya temukan: http://css-tricks.com/snippets/jquery/fire-event-when-user-is-idle/
Inilah JS:
sumber
Anda dapat menggunakan solusi yang disebutkan di bawah ini
sumber
Saya menggunakan pendekatan ini, karena Anda tidak perlu terus-menerus mengatur ulang waktu ketika suatu peristiwa menyala, sebagai gantinya kami hanya mencatat waktu, ini menghasilkan titik awal yang tidak digunakan.
sumber
Anda mungkin dapat mendeteksi ketidakaktifan pada halaman web Anda menggunakan trik mousemove terdaftar, tetapi itu tidak akan memberi tahu Anda bahwa pengguna tidak pada halaman lain di jendela atau tab lain, atau bahwa pengguna berada di Word atau Photoshop, atau WOW dan tidak melihat halaman Anda saat ini. Secara umum saya hanya akan melakukan prefetch dan mengandalkan multi-tasking klien. Jika Anda benar - benar membutuhkan fungsi ini, Anda melakukan sesuatu dengan kontrol activex di windows, tetapi itu paling jelek.
sumber
Berikut adalah layanan AngularJS untuk menyelesaikan di Angular.
Ingatlah bahwa pemeriksa siaga ini akan berjalan untuk semua rute, sehingga harus diinisialisasi
.run()
saat memuat aplikasi bersudut. Kemudian Anda dapat menggunakanidleChecker.secondsIdle
di dalam setiap rute.sumber
Debounce sebenarnya ide bagus! Di sini versi untuk proyek gratis jQuery:
sumber
Sesederhana itu bisa, deteksi ketika mouse hanya bergerak:
sumber
Yah Anda bisa melampirkan klik atau acara mouse ke badan dokumen yang mengatur ulang timer. Memiliki fungsi yang Anda panggil pada interval waktu yang memeriksa apakah timer melebihi waktu yang ditentukan (seperti 1000 milis) dan mulai preloading Anda.
sumber
Javascript tidak memiliki cara untuk mengatakan penggunaan CPU. Ini akan merusak sandbox javascript berjalan di dalamnya.
Selain itu, mengaitkan peristiwa onmouseover dan onkeydown halaman mungkin akan berhasil.
Anda juga bisa mengatur penggunaan setTimeout di acara onload untuk menjadwalkan fungsi yang akan dipanggil setelah penundaan.
sumber