2015-02-06 55 views
0

我在鼠標關閉期間將對象移動到1個方向,鼠標指針上升時應停止動畫。setTimeout在clearTimeout被調用後繼續運行

我正在使用setTimeout,但在發佈clic之後它會一直運行一段時間。

var stopmov 
function tomove(){ 
    $('.plwid').animate({ 
     left: '+=1' 
    },1); 
    stopmov=setTimeout(function(){ tomove(); }, 1); 
} 

$('.plwid').mouseup(function(){ 
    clearTimeout(stopmov); 
}).mousedown(function(){ 
    tomove(); 
}); 

http://jsfiddle.net/oa9bsqy1/

+4

您需要檢查,如果鼠標下來,而不是從你的遞歸方法setTimeout排隊成千上萬的回調。 – j08691 2015-02-06 20:16:38

+0

你不需要匿名函數包裝器。你可以使用'setTimeout(tomove,1)'和'mousedown(tomove)'。 – Oriol 2015-02-06 20:20:11

+0

@MattBurland爲什麼有問題?每個計時器只會創建一個新計時器:下一個計時器。因此取消最後一個計時器將停止動畫。問題是最後的計時器並不總是被取消。 – Oriol 2015-02-06 20:28:43

回答

0

我已經setTimeoutsetInterval玩耍了,但我認爲這是更好的jQuery的動畫的完成回調使用遞歸調用。

停止然後很容易與$('.plwid').stop();

請在下面找到演示JSFiddle

function tomove() { 
 
    $('.plwid').animate({ 
 
     left: '+=10' 
 
    }, 
 
    100, 'linear', tomove); 
 
} 
 

 
$(document).mouseup(function() { 
 
    $('.plwid').stop(); 
 
}); 
 

 
$('.plwid').mousedown(function() { 
 
    tomove(); 
 
});
.plwid { 
 
    position:relative; 
 
    left:10px; 
 
    background:red; 
 
    width:100px; 
 
    height:100px; 
 
    cursor:pointer; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="plwid"></div>

1

你可能最好將文件上的moueup而不是元素。

$(document).mouseup(function(){ 
    clearTimeout(stopmov); 
}); 
$('.plwid').mousedown(function(){ 
    tomove(); 
}); 

其他問題是你正在使用的1毫秒是產生噸的命中,你需要選擇一個更合理的數字。

0
var mouseIsDown = false; 

function tomove(){ 
    $('.plwid').animate({ 
    left: '+=1' 
    },1); 
    if(mouseIsDown) setTimeout(function(){ tomove(); }, 1); 
} 

$('.plwid').mousedown(function(){ 
    mouseIsDown = true; 
    tomove(); 
}); 
$(document).mouseup(function(){ 
    mouseIsDown = false; 
}); 
0

貌似tomove運行時,它都會再次的setTimeout運行,而stopmov變量只會有非常最近...

所以,只取

stopmov=setTimeout(function(){ tomove(); }, 1); 

出來的第一個功能。當你停下來時調用settimeout。

var stopmov 
function tomove(){ 
    $('.plwid').animate({ 
     left: '+=1' 
},1); 
} 
$('.plwid').mouseup(function(){ 
    clearTimeout(stopmov); 
}).mousedown(function(){ 
    stopmov=setTimeout(function(){ tomove(); }, 1); 
}); 
+1

但是不會有任何動畫。每次點擊只需移動一個像素。 – Oriol 2015-02-06 20:25:58

+0

哦對了...我正在setTimeout與setInterval混淆。你嘗試過setInterval嗎? – user2124444 2015-02-06 20:33:33

+0

和clearInterval – user2124444 2015-02-06 20:34:42