Reputation: 28147
I'm trying to create a kind of slideshow.
The problem:
function slides(x) {
$("#irack").stop().animate({"left": x}, 20);
};
setInterval(slides(-30),300);
This code only moves the div to the left 1 time.
Why doesn't it move the div every 300ms ?
Upvotes: 7
Views: 19835
Reputation: 10788
Shortest answer is:
setInterval(function(){
$("#irack").stop().animate({"left": -30}, 20)
},300);
Upvotes: 0
Reputation: 1074355
You need to wrap the code to run at intervals in a function:
function slides(x) {
$("#irack").stop().animate({"left": x}, 20);
};
setInterval(function() {
slides(-30);
}, 300);
Did you really mean setInterval
? That will keep happening, every 300ms or so. If you want it just to happen once, use setTimeout
instead.
Update: If you want to cancel the interval later, you'll need to save the handle to a variable:
// 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;
Note the use of 0
for the handle when it's not set. 0
is an invalid return value from setInterval
, so you can rely on it. (You can use undefined
or null
if you like as well, just be sure to check for them.)
Upvotes: 21
Reputation: 28147
Oh, I've found the problem :D
$("#irack").stop().animate({"left": x}, 20);
The problem is that "x" is a constant, and it changes the "left" to x and keeps it that way.
I should do this way:
x=$("#irack").offset().left+x;
$("#irack").stop().animate({"left": x}, 20);
And thanks a lot for pointing that "wrapping" stuff :D.
Upvotes: 2
Reputation: 179066
The reason it doesn't work is because you're calling the function you're passing to setInterval
You'll need to wrap the function in an anonymous function to pass a parameter as part of the interval.
function slides(x) {
$("#irack").stop().animate({"left": x}, 20);
};
setInterval(function(){slides(-30)},300);
Note how the slides(-30)
is now wrapped in an anon function.
Upvotes: 2
Reputation: 82913
In you call to setInterval the slides method is being called inline change the call to as below:
setInterval(function(){slides(-30);},300);
Upvotes: 5