2013-03-19 16 views
9
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; 
} 

Sono voler eseguire codice mentre il mouse è premuto, i cant trovare qualsiasi cosa per suggerire che posso fare, mentre (mousedown) così ho provato facendo una bandiera per la mousedown che viene resettato al passaggio del mouse Tuttavia, credo che il ciclo while sia quello che mi fa andare a rimanere bloccato in un loop infinito.JavaScript mentre mousedown

Qualche consiglio per aiutare con quello che sto cercando di ottenere?

risposta

10

Bisogna richiamare l'attività mousedown in qualche intervallo ragionevole. Mi piacerebbe fare questo:

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); 
+0

Posso chiederti perché -1 è usato come assegnato a 0? – Larry

+0

Non sono sicuro che l'ID di 0 possa esistere e sono abituato a usare '-1' per i valori di' null'. In javascript, puoi impostare direttamente 'mousedownID = null' e chiedere a' if (mousedownID === null) '(controllando datatype con' === 'di sicuro). –

+1

@ TomášZato Btw, non è necessario testare per 'null' prima di chiamare' clearInterval() '. Come con ['clearTimeout()'] (https://developer.mozilla.org/en-US/docs/DOM/window.clearTimeout#Notes): "* Il passaggio di un ID non valido [...] non ha effetto (e non lancia un'eccezione). * "Sebbene questi metodi non siano in realtà standardizzati, quasi tutte le implementazioni attuali lo seguono. –

5

Non si può fare che, come la funzione deve terminare prima di un altro evento viene elaborato, ma si potrebbe chiamare una funzione ripetutamente fino a quando il mouse è in alto:

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) 
}); 
+1

Si potrebbe anche dichiarare 'timer' nel campo di applicazione al di fuori, come l'OP stava facendo con' mdflag', e spostare l'evento 'mouseup' fuori' mousedown' così isn' t continuando ad aggiungerne altri. –

+0

Hai pensato a cosa accadrà, se premo il pulsante e lasci la finestra? –

+0

@ JonathanLonowski Hai ragione. Ho modificato –