2016-12-07 52 views
3

我想在mouseenter事件時開始計數,然後在mouseleave事件中停止計數。但是,正如您在本示例的控制檯中所看到的,mouseleave中的clearInterval(timerId)命令不起作用。clearInterval(timerId)不工作

有什麼問題?

var timerId; 
 
clearInterval(timerId); 
 

 
$("#demo").mouseenter(function() { 
 
    setTimeout(function() { 
 
    startcounting(timerId); 
 
    }, 2000) 
 
}); 
 

 
$("#demo").mouseleave(function() { 
 
    clearInterval(timerId); 
 
}); 
 

 
function startcounting(timerId) { 
 
    var number = 0; 
 
    timerId = setInterval(function() { 
 
    increment(timerId); 
 
    }, 100); 
 

 
    function increment(timerId) { 
 
    if (number >= 100) { 
 
     number = 0; 
 
     clearInterval(timerId); 
 
    } else { 
 
     number++; 
 
     console.log(number); 
 
    } 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="demo">demo</div>

+0

請注意,所有相關的代碼應放置在的問題,以防萬一的jsfiddle下降。如果發生了這種情況,你的問題將無法回答。 –

+0

非常感謝您的評論!我是新來的,如果你沒有告訴我,我永遠不會想到。 – themis93

回答

3

的問題是,因爲你已經有了一個名爲timerIdstartcounting()increment()功能,這隱藏着同一個名字的變量在外部範圍的參數 - 這是一個你需要。

如果您刪除這些屬性,代碼工作:

var timerId; 
 
clearInterval(timerId); 
 

 
$("#demo").mouseenter(function() { 
 
    setTimeout(function() { 
 
     startcounting(); // remove here 
 
    }, 2000) 
 
}); 
 

 
$("#demo").mouseleave(function() { 
 
    clearInterval(timerId); 
 
}); 
 

 
function startcounting() { // remove here 
 
    var number = 0; 
 
    timerId = setInterval(function() { 
 
     increment(timerId); 
 
    }, 100); 
 

 
    function increment() { // remove here 
 
     if (number >= 100) { 
 
      number = 0; 
 
      clearInterval(timerId); 
 
     } else { 
 
      number++; 
 
      console.log(number); 
 
     } 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="demo">demo</div>

+0

我已經將您的答案中的代碼嵌入到代碼片段中,就像我對問題所做的那樣。您可能希望查看和更新​​它,或者如果您反對我這樣做,請回滾。 – doppelgreener

+0

@doppelgreener沒問題,謝謝 –

+0

非常感謝! – themis93