JavaScript при наведении мыши

var mdflag;
var count = 0;

document.addEventListener("mousedown",mdown,false);
    document.addEventListener("mouseup",mup,false);
}


function mdown()
{
    mdflag=true;
    while(mdflag)
    document.getElementById("testdiv").innerHTML = count++;

}
function mup()
{
    mdflag = false;
}

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

Любой совет, чтобы помочь с тем, что я пытаюсь достичь?


person Larry    schedule 19.03.2013    source источник


Ответы (3)


Вы должны вызывать активность mousedown с некоторым разумным интервалом. я бы сделал так:

var mousedownID = -1;  //Global ID of mouse down interval
function mousedown(event) {
  if(mousedownID==-1)  //Prevent multimple loops!
     mousedownID = setInterval(whilemousedown, 100 /*execute every 100ms*/);


}
function mouseup(event) {
   if(mousedownID!=-1) {  //Only stop if exists
     clearInterval(mousedownID);
     mousedownID=-1;
   }

}
function whilemousedown() {
   /*here put your code*/
}
//Assign events
document.addEventListener("mousedown", mousedown);
document.addEventListener("mouseup", mouseup);
//Also clear the interval when user leaves the window with mouse
document.addEventListener("mouseout", mouseup);
person Tomáš Zato - Reinstate Monica    schedule 19.03.2013
comment
Могу я спросить, почему -1 используется вместо 0? - person Larry; 19.03.2013
comment
Я не уверен, может ли существовать идентификатор 0, и я привык использовать -1 для значений null. В javascript вы можете напрямую установить mousedownID = null и задать if(mousedownID===null) (обязательно проверяя тип данных с помощью ===). - person Tomáš Zato - Reinstate Monica; 19.03.2013
comment
@TomášZato Кстати, вам не обязательно проверять null перед вызовом clearInterval(). Как и в случае с clearTimeout(): Передача недопустимого ID [...] не имеет никакого эффекта (и не генерирует исключение). Хотя эти методы на самом деле не стандартизированы, почти все текущие реализации следуют этому принципу. - person Jonathan Lonowski; 19.03.2013
comment
Хорошо, что вы указали на это. Но это все еще обсуждаемо, если clearTimeout проверяет ID быстрее, чем == оператор. Например, он может перебирать массив идентификаторов тайм-аута, что будет медленнее. - person Tomáš Zato - Reinstate Monica; 19.03.2013
comment
Это не очень хорошо работает, потому что event не обновляется. - person PugsAreCute; 22.05.2021
comment
@PugsAreCute Можете ли вы уточнить? - person Tomáš Zato - Reinstate Monica; 23.05.2021
comment
Событие не обновляется при каждой итерации, поэтому, например, event.clientX всегда будет оставаться неизменным. - person PugsAreCute; 23.05.2021
comment
@PugsAreCute Во-первых, нет глобальной переменной события. Если вы хотите отслеживать положение мыши, вам нужно прослушивать событие mousemove. - person Tomáš Zato - Reinstate Monica; 23.05.2021

Вы не можете этого сделать, так как ваша функция должна завершиться до того, как будет обработано другое событие, но вы можете повторно вызывать функцию, пока мышь не будет поднята:

var timer;
document.addEventListener("mousedown", function(){
     timer=setInterval(function(){
          document.getElementById("testdiv").innerHTML = count++;
     }, 100); // the above code is executed every 100 ms
});
document.addEventListener("mouseup", function(){
    if (timer) clearInterval(timer)
});
person drunken bot    schedule 19.03.2013
comment
Вы также можете объявить timer во внешней области, как это делал OP с mdflag, и переместить событие mouseup из mousedown, чтобы он не продолжал добавлять их больше. - person Jonathan Lonowski; 19.03.2013
comment
Вы думали, что будет, если я нажму на кнопку и выйду из окна? - person Tomáš Zato - Reinstate Monica; 19.03.2013

Вам нужно использовать setInterval для выполнения вашей функции и clearInternal для остановки

let interval = setInterval(function(){
    console.log("executing...");
}, 0);


document.addEventListener("mouseup", function(){
    clearInterval(interval); 
    console.log('End'); 
});
person x-rw    schedule 28.01.2021