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

Ich bin zu wollen Code auszuführen, während die Maus nach unten ist, ich kann nicht alles, was ich tun kann, um vorschlagen finden, während (mousedown-) so ich habe tryed eine Flagge für mousedown- machen, die auf Maus zurückgesetzt aber ich glaube, die While-Schleife ist das, was mich dazu bringt, in einer Endlosschleife stecken zu bleiben.JavaScript während mousedown-

Irgendwelche Ratschläge, um mit dem zu helfen, was ich versuche zu erreichen?

Antwort

10

Sie MouseDown- Aktivität aufrufen müssen in ein vernünftiges Intervall. Ich würde dies tun:

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

Kann ich fragen, warum -1 als 0 verwendet wird? – Larry

+0

Ich bin mir nicht sicher, ob ID von 0 existieren kann - und ich bin gewohnt, '-1' für' null' Werte zu verwenden. In Javascript können Sie 'mousedownID = null' direkt setzen und' if (mousedownID === null) 'fragen (den Datentyp mit' === 'sicher überprüfen). –

+1

@ TomášZato Übrigens müssen Sie nicht unbedingt vor dem Aufruf von 'clearInterval()' auf 'null' testen. Wie bei ['clearTimeout()'] (https://developer.mozilla.org/en-US/docs/DOM/window.clearTimeout#Notes): "* Das Übergeben einer ungültigen ID [...] hat keine Wirkung (und wirft keine Ausnahme auf). "" Obwohl diese Methoden nicht wirklich standardisiert sind, folgen fast alle aktuellen Implementierungen. –

5

Sie können das nicht tun, wie Ihre Funktion vor einem anderen Ereignis enden muss verarbeitet wird, aber man könnte eine Funktion wiederholt aufrufen, bis die Maus nach oben ist:

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

Sie könnten auch erklären 'timer' im äußeren Umfang, wie die OP mit' mdflag' tat, und bewegen Sie das 'mouseup' Ereignis aus' mousedown' so es isn‘ t weitere hinzufügen von ihnen. –

+0

Hast du gedacht, was passiert, wenn ich den Knopf drücke und das Fenster verlasse? –

+0

@ JonathanLonowski Sie haben Recht. Ich habe bearbeitet. –

Verwandte Themen