hoverしたらsetIntervalが始まり、条件を満たしたらclearIntervalしたかった。
しかし、短時間に何回もhoverを繰り返したときに、clearIntervalが効かなくなることがあった。
そんな時の解決策。
ページが表示されたらsetIntervalが始まり、「ストップ」をクリックしたらclearIntervalする場合
<div class="box"></div>
<div class="stop">ストップ</div>
boxAime = setInterval(boxChange, 50);
var boxWidth = 0;
function boxChange(){
boxWidth++;
$('.box').width(boxWidth);
}
$('.stop').click(function(){
clearInterval(boxAime);
});
「スタート」をhoverしたらsetIntervalが始まり、条件を満たしたらclearIntervalする場合(不完全)
<div class="box"></div>
<div class="start">スタート</div>
$('.start').mouseenter(function(){
startChange();
});
function startChange(){
boxAime = setInterval(boxChange, 50);
}
var boxWidth = 0;
function boxChange(){
boxWidth++;
if(boxWidth > 100){
clearInterval(boxAime);
}
$('.box').width(boxWidth);
}
連続して何回もhoverすると、止まらなくなってしまう。
「スタート」をhoverしたらsetIntervalが始まり、条件を満たしたらclearIntervalする場合(解決策)
原因は、連続してhoverしたことによって、setIntervalがいくつも実行されてしまっていたが、clearIntervalは1つしか止めていなかったからです。
clearIntervalは、引数にsetInterval実行時の戻り値を渡すことで処理を止めています。
なので、setIntervalの戻り値を全て保持し、全て止めるようにすれば良いです。
<div class="box"></div>
<div class="start">スタート</div>
$('.start').mouseenter(function(){
startChange();
});
var arrChangeCnt = new Array();
function startChange(){
arrChangeCnt.push(boxAime = setInterval(boxChange, 50));
}
var boxWidth = 0;
function boxChange(){
boxWidth++;
if(boxWidth > 100){
if (arrChangeCnt.length > 0) {
clearInterval(arrChangeCnt.shift());
}
}else{
$('.box').width(boxWidth);
}
}