Jquery setInterval()不工作

Jquery setInterval()不工作,jquery,function,Jquery,Function,我正在尝试制作一种幻灯片 问题是: function slides(x) { $("#irack").stop().animate({"left": x}, 20); }; setInterval(slides(-30),300); 此代码仅将div向左移动1次 为什么它不每隔300毫秒移动一次div?您需要包装代码,以便在函数中每隔一段时间运行一次: function slides(x) { $("#irack").stop().animate({"left": x

我正在尝试制作一种幻灯片

问题是:

function slides(x) {
      $("#irack").stop().animate({"left": x}, 20);
 };
setInterval(slides(-30),300);
此代码仅将div向左移动1次


为什么它不每隔300毫秒移动一次div?

您需要包装代码,以便在函数中每隔一段时间运行一次:

function slides(x) {
      $("#irack").stop().animate({"left": x}, 20);
};
setInterval(function() {
    slides(-30);
}, 300);
你真的是什么意思?这种情况将持续发生,大约每300毫秒一次。如果你想让它只发生一次,用它来代替

更新:如果以后要取消间隔,需要将句柄保存到变量:

// Somewhere appropriate, have a variable for the handle
var handle = 0; // 0 = not running

...

// Starting:
handle = setInterval(...);

...

// Stopping:
if (handle != 0) {
    clearInterval(handle);
}
handle = 0;

注意未设置手柄时,手柄使用
0
0
是来自
setInterval
的无效返回值,因此您可以依赖它。(如果您愿意,也可以使用
undefined
null
,只需确保检查它们即可。)

在调用setInterval时,正在内联调用slides方法,将调用更改为如下所示:

setInterval(function(){slides(-30);},300);

它不起作用的原因是您正在调用传递给setInterval的函数

您需要将函数包装在匿名函数中,以作为间隔的一部分传递参数

function slides(x) {
      $("#irack").stop().animate({"left": x}, 20);
 };
setInterval(function(){slides(-30)},300);

注意
幻灯片(-30)
现在是如何包装在一个anon函数中的。

哦,我发现了问题:D

$("#irack").stop().animate({"left": x}, 20);
问题是“x”是一个常数,它将“left”改为x并保持不变

我应该这样做:

x=$("#irack").offset().left+x;
$("#irack").stop().animate({"left": x}, 20);
非常感谢你指出“包装”的东西:D.

最简短的答案是:

setInterval(function(){
   $("#irack").stop().animate({"left": -30}, 20)
},300);

否,我需要setInterval,因为我将在MouseDown上执行setInterval函数,并在MouseOut中取消它:D@Cristy:啊,那么你需要间隔的句柄。我会更新的,谢谢!这就成功了。那么为什么slides()方法需要包装在另一个函数中呢?@loeschg:因为我们需要将参数传递给它(
-30
)。如果您知道自己在ECMAScript 5环境中,可以这样使用:
setInterval(slides.bind(undefined,-30),300)
但是你还不能指望ECMAScript 5的功能(除非你包括一个垫片,因为
bind
是垫片可以做的事情之一)。@loeschg:不客气!ECMAScript 5(ES5)是“JavaScript”的最新版本:标准语言的官方名称是ECMAScript,第五版规范大约在两年前发布。“垫片”(在此上下文中)是在本机还不支持它的浏览器上提供标准功能的东西。ES5中的一些新功能甚至可以在第三版引擎上提供(没有第四版),其他的则不能。搜索“es5垫片”,您将找到几个。最好是离题:
setInterval
如果运行时间长,可能会导致问题。通常建议使用递归的
setTimeout
调用,而不是
setInterval
。它不会运行太多时间。正如我在另一篇评论中所说的,我只是在按住鼠标的同时使用setInterval滚动div,然后清除间隔。
setInterval
不是jQuery函数。这是一个内置的JavaScript函数。@mareoraft是的,7年后,现在我知道:DThis帮了我的忙。谢谢有人知道为什么要这么做吗?