Cara mendeteksi kapan mouse berhenti

Saya telah menulis kode JavaScript berikut. Saya menggunakannya untuk mendeteksi kapan mouse bergerak dan kapan berhenti. Fungsi MouseStopped() adalah perulangan ratusan item yang akan memberi tahu saya di mana mouse berhenti, jadi saya ingin memanggilnya hanya ketika mouse telah berhenti.

var CheckMovement;
var stopLoop = false;
var n = 0;
canvas.addEventListener('mousemove', function (evt) {
    CheckMovement = setInterval(function () { HasMouseStopped(evt) }, 250);
}, false)

function HasMouseStopped(evt) {
    var mousePos = getMousePos(canvas, evt);
    newMouseX = mousePos.x;
    newMouseY = mousePos.y;
        if ((newMouseX !== mouseX) && (newMouseY !== mouseY)) {

            stopLoop = true;
        } else {
            //stopped moving
            clearInterval(CheckMovement);
            stopLoop = false;
            n = 0;
            MouseStopped();
        }
        mouseX = newMouseX;
        mouseY = mousePos.y;
}

function MouseStopped() {
    while (arr.length > n) {
        if (stopLoop) { break; }
        if (ctx.isPointInPath(mouseX, mouseY)) {
            //tooltip text
            ctx.font = '12pt Candara';
            ctx.fillStyle = 'black';
            ctx.fillText(arr[n], mouseX + 10, mouseY - 5);
            break;
        }
        n++;
    }
}

Sekarang saya memiliki masalah berikut:

  1. Meskipun saya menelepon clearInterval(CheckMovement), itu tidak berhenti mengulangi; itu berjalan terus menerus, yang menyebabkan masalah panggilan MouseStopped() beberapa kali. Mengapa tidak berhenti?
  2. Saya ingin mematahkan MouseStopped() di tengah operasinya jika mouse digerakkan sebelum menyelesaikan perulangannya. Inilah sebabnya saya menyetel stopLoop = true; Namun, sepertinya hal itu juga tidak berfungsi sebagaimana mestinya. Bagaimana cara mencapainya?

Terima kasih.

EDIT


person Hannington Mambo    schedule 15.07.2013    source sumber
comment
Anda memiliki tes di dalam sebuah loop yang tidak dapat disetel ke true saat loop sedang berjalan... while (arr.length > n) { if (stopLoop) { break; } - mouseStopped Anda juga harus menggunakan setTimeout atau interval agar dapat diinterupsi   -  person mplungjan    schedule 15.07.2013
comment
Pertama, tentukan kapan mouse dianggap berhenti... Apakah dalam keadaan tidak aktif selama 3 detik, atau 3 mil, yang satu akan memukul secara signifikan lebih dari yang lain| Kedua, atur fungsi interval pada pergerakan mouse, bandingkan lokasi mouse sebelumnya dan saat ini hingga cocok dan hentikan fungsi interval Anda   -  person Seth McClaine    schedule 15.07.2013
comment
gunakan setTimeout sebagai gantinya   -  person Loïc Faure-Lacroix    schedule 15.07.2013
comment
Terima kasih mplungjan atas pencerahannya. Saya dapat mengerjakan ulang bagian ini.   -  person Hannington Mambo    schedule 15.07.2013
comment
Loic, itu bisa saja. Terima kasih.   -  person Hannington Mambo    schedule 15.07.2013
comment
Seth, saya lebih suka tes tidak aktif selama satu detik; perulangan juga membutuhkan waktu satu detik lagi, sehingga dibulatkan menjadi 2 detik. Namun saya ingin memeriksa ketidakaktifan itu setiap seperempat detik... Bagian kedua dari komentar Anda adalah apa yang menurut saya sedang saya lakukan, apakah saya salah?   -  person Hannington Mambo    schedule 15.07.2013
comment
Saya pikir pertanyaannya di sini adalah 'bagaimana menghentikan putaran ketika suatu gerakan terdeteksi'. Di sinilah saya punya masalah. Saya telah mencoba menggunakan pengatur waktu tetapi sepertinya tidak berhasil. Perulangan berjalan selama 100 ms, berhenti untuk memeriksa apakah mouse digerakkan, lalu dilanjutkan jika tidak ada gerakan. Kelihatannya logis tapi sangat sia-sia, namun, aku tetap tidak bisa mendapatkan hasil seperti itu. Siapa pun yang memiliki gagasan bagaimana hal itu dapat dibangun.   -  person Hannington Mambo    schedule 16.07.2013
comment
@HanningtonMambo: Apakah Anda dapat mengetahuinya? Jika iya, bisakah Anda menandai postingan ini sebagai terjawab (klik tanda centang hijau).   -  person Robbie Wxyz    schedule 24.01.2015


Jawaban (2)


Sederhana saja: saat mouse digerakkan, tetapkan batas waktu XXX milidetik di masa mendatang. Hapus juga batas waktu sebelumnya untuk mengatur ulang waktu. Seperti ini di pendengar gerakan mouse

clearTimeout(timer);
timer=setTimeout(mouseStopped,300);

Lihat JSFiddle ini.

person Robbie Wxyz    schedule 09.10.2013

Setelah berpikir sejenak, menurut saya fungsi debounce dapat memenuhi kebutuhan Anda. Lodash.js menyediakannya.

person Stephen.W    schedule 06.11.2020