Jquery 我想参加一些跳水比赛
也许这有点幼稚,但我还在学习Jquery。我有几个div(50x50px绝对定位),这段代码使它们在屏幕上移动。 我想这样做,如果你点击绿色框,它会缩短间隔,从而移动得更快。很明显我做错了什么,我只是不知道是什么Jquery 我想参加一些跳水比赛,jquery,Jquery,也许这有点幼稚,但我还在学习Jquery。我有几个div(50x50px绝对定位),这段代码使它们在屏幕上移动。 我想这样做,如果你点击绿色框,它会缩短间隔,从而移动得更快。很明显我做错了什么,我只是不知道是什么 $(document).ready(function(){ var greenSpeed = 300; var redSpeed = 300; var redLeft = $('#red').offset().left; setInterval(function() {
$(document).ready(function(){
var greenSpeed = 300;
var redSpeed = 300;
var redLeft = $('#red').offset().left;
setInterval(function() {
$('#red').css('left', ++redLeft);
}, redSpeed);
var greenLeft = $('#green').offset().left;
setInterval(function() {
$('#green').css('left', ++greenLeft);
}, greenSpeed);
$('#green').click(function() {--greenSpeed});
});
启动计时器后,对计时器间隔的更新将无效。也许您应该保持计时器间隔恒定,然后改变增量的大小,而不是总是向位置添加1
也就是说,“redSpeed”和“greenSpeed”将从1开始,然后在每次迭代中将它们添加到“redLeft”或“greenLeft”。单击只需将“速度”变量增加1(或2或任何值)。好的。。。所以我想出了办法,但如果有人能解释为什么这样做会有帮助
var greenLeft = $('#green').offset().left;
function moveGreen() {
setTimeout(moveGreen, greenSpeed);
$('#green').css('left', ++greenLeft);
}
moveGreen();
$('#green').click(function() {greenSpeed-=20});
我的猜测是setInterval在第一次调用时只检查一次
colorSpeed
,所以即使我减小了速度计数器,也没关系。有没有一种方法可以使用/setInterval来执行此操作,或者递归setTimeout调用是唯一的方法?第一种方法不起作用的原因是,setInterval被传递的是存储在greenSpeed中的值,而不是指向该变量的指针。因此,对greenSpeed的后续更新没有任何效果。在第二位代码中,重复调用setTimeout。每次调用它时,都会传递存储在greenSpeed中的当前值,从而在单击后使用新值。这就像您希望的那样工作
$(function(){
var greenSpeed = 300;
var redSpeed = 300;
var redLeft = $('#red').offset().left;
function raceRed() {
setInterval(function() {
$('#red').css('left', ++redLeft);
}, redSpeed);
}
$('#red').click(function() {
--redSpeed;
raceRed();
});
raceRed();
var greenLeft = $('#green').offset().left;
function raceGreen() {
setInterval(function() {
$('#green').css('left', ++greenLeft);
}, greenSpeed);
}
$('#green').click(function() {
--greenSpeed;
raceGreen();
});
raceGreen();
});
+1.在每次单击时清除并重置间隔,或者使用setTimeout。与其说它只是“检查”了“colorSpeed”值,还不如说它们只是传递给函数的数字,因此变量的存在本身是未知的,并且“setInterval()无法检测到”.也许这应该是对先前答案的评论,而不是答案