2016-12-07 54 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