2016-03-15 5 views
-1

Вот мой код:Detect Держите мышь-Click в Javascript

var mouseDown = false; 

document.body.onmousedown = function() { 
    console.log("MOUSE DOWN"); 
    mouseDown = true; 
    increaseRad(); 
} 
document.body.onmouseup = function() { 
    console.log("MOUSE UP"); 
    mouseDown = false; 
} 

function increaseRad(){ 
    rad = 0; 
    while(mouseDown){ 
    console.log("mouse is still down"); 
    rad++; 
    console.log(rad) 
    } 
} 

Когда я нажимаю вниз, increaseRad запускается, но цикл в то время как внутри никогда не заканчивается.

Любая идея, почему?

+0

Я считаю, что ваша проблема заключается в том, что вы увеличиваете и уменьшаете значение для вашего mousedown, а не просто устанавливаете его в true/false, а затем проверяете, помогает ли это. –

+0

Нет, это не имеет значения. Я полагал, что функция onmousedown выполняется асинхронно, поэтому значение установлено в значение 'true', и если оператор запущен. Но это не похоже на woek. –

+0

. Дело в том, что ваш чек, чтобы увидеть, действительно ли мышь на самом деле вниз, кажется, называется один раз, это должно быть в своей собственной функции, чтобы отслеживать, когда вы ввели указатель мыши и когда вы ушли Это. Эта функция затем должна быть вызвана в вашем 'onmousedown'. –

ответ

1

Проблема в том, что ваш код работает как цикл блокировки.

while(mouseDown){ 
    console.log("mouse is still down"); 
    rad++; 
    console.log(rad) 
} 

Браузер оценивает Javascript в одном потоке и эта петля никогда не будет пауза, чтобы браузер обрабатывает эти обработчики событий.

Вместо этого вы можете просто использовать асинхронные функции для прослушивания событий mousedown, а затем запустить таймер. Если мышь по-прежнему опускается, когда таймер заканчивается, вы можете считать это длинным кликом.

var mouseIsDown = false; 

window.addEventListener('mousedown', function() { 
    mouseIsDown = true; 
    setTimeout(function() { 
    if(mouseIsDown) { 
     // mouse was held down for > 2 seconds 
    } 
    }, 2000); 
}); 

window.addEventListener('mouseup', function() { 
    mouseIsDown = false; 
}); 

Эти асинхронные действия (addEventListener, setTimeout) не будет блокировать основной поток.

+0

В этом примере он может обнаруживать удержание мыши только в самом конце 'mouseup'. С обратным вызовом с 'setTimeout' в функции« mousedown »он может обнаружить это раньше и выполнить какое-то действие на основе этого. не нуждается в изменении кода, просто хотел указать, что в случае, если OP хочет уведомить пользователя в случае удержания. – MarcoL

+0

Очень хороший момент, я обновлю код. –

+0

Смотрите, что я хочу, чтобы целое число увеличивалось, скажем, каждые 10 миллисекунд. Чем дольше я буду удерживать мышь, тем больше будет целое число. Не должно быть предела –