2013-07-15 8 views
8

मैंने निम्नलिखित जावास्क्रिप्ट कोड लिखे हैं। मैं इसका उपयोग यह पता लगाने के लिए कर रहा हूं कि माउस कब चल रहा है और जब यह बंद हो गया है। MouseStopped() फ़ंक्शन सैकड़ों आइटमों का एक लूप है जो मुझे बताएगा कि माउस कहां रुक गया है, इसलिए मैं इसे केवल कॉल करना चाहता हूं जब माउस बंद हो गया हो।माउस को कब बंद किया गया है इसका पता लगाने के लिए

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

अब मैं निम्नलिखित समस्या है:

  1. हालांकि मैं clearInterval(CheckMovement) बोल रहा हूँ, यह रोक-बार दोहराना नहीं करता है, यह लगातार चल रहा है, जिससे की समस्या MouseStopped() कई बार कॉल कर रही है। यह क्यों नहीं रोक रहा है?
  2. यदि मैं इसे लूप पूरा करने से पहले माउस ले जाया गया है तो मैं अपने ऑपरेशन के बीच MouseStopped() तोड़ना चाहता हूं। यही कारण है कि मैं stopLoop = true; सेट कर रहा हूं हालांकि, यह भी इरादे के रूप में काम नहीं कर रहा है। मैं इन्हें कैसे प्राप्त कर सकता हूं?

धन्यवाद।

संपादन

+0

आपके पास एक लूप के अंदर एक परीक्षण है जिसे लूप चल रहा है, जबकि सत्य पर सेट नहीं किया जा सकता है ... 'जबकि (arr.length> n) {if (stopLoop) {break; } '- आपके माउस स्टॉपप्ड को भी सेटटाइमआउट या इंटरवल को इंटरप्टेबल करने के लिए उपयोग करना होगा – mplungjan

+0

सबसे पहले, परिभाषित करें कि जब माउस को रोका जाता है ... क्या यह 3 सेकंड या 3 मिलियन के लिए निष्क्रिय है, तो एक दूसरे से काफी अधिक प्रभावित होगा। दूसरा, माउस चाल पर एक अंतराल फ़ंक्शन सेट करें, पिछले और वर्तमान माउस स्थान की तुलना करें जब तक कि वे आपके अंतराल फ़ंक्शन से मेल नहीं खाते और रोकें –

+0

अंतर्दृष्टि के लिए –

उत्तर

14

यह वास्तव में सरल है: जब माउस ले जाया जाता है, भविष्य में XXX मिलीसेकेंड के लिए समय समाप्त निर्धारित किया है। साथ ही, समय को रीसेट करने के लिए किसी भी पिछले टाइमआउट को साफ़ करें। इस तरह MouseMove श्रोता

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

में इस JSFiddle देखें।

+1

सुरुचिपूर्ण समाधान। – jhc

संबंधित मुद्दे