[jQuery] Using setTimeout with a callback (callback appends function content)
I'm trying to create a simple image slideshow that is timed based on
when the image is loaded. I'm having a problem when using callback
functions and setTimeout. The callback function seems to append each
time the function is called. I was wondering how to resolve this
problem
Order of events:
1. Click "Play"
2. "Play" message is shown.
3. First image switch "Set" message is shown
4. "Play" message is shown.
5. Second image switch "Set" message is shown twice.
6. "Play" message is shown.
7. Third image switch "Set" message is shown three times.
...
etc to n "Set" messages.
The function in question is the $.Play() function. I appreciate any
guidance on what could solve the problem I am having.
Code:
$(document).ready(function(){
$("#first").click(function(){
$.Pause();
$.FirstImage();
return false;
});
$("#prev").click(function(){
$.Pause();
$.PreviousImage();
return false;
});
$("#play").click(function(){
$("#play").fadeOut(200, function(){
$("#pause").fadeIn(200, function(){
//timerT = setTimeout("$.Play()",2000);
$.Play();
});
});
return false;
});
$("#pause").click(function(){
$.Pause();
return false;
});
$("#next").click(function(){
$.Pause();
$.NextImage();
return false;
});
$("#last").click(function(){
$.Pause();
$.LastImage();
return false;
});
$.Initialize();
});
$.LoadImage = function(callback) {
$("#imagebox").fadeOut(500, function(){
$("#ssimage").fadeOut(10, function(){
$("#loadbox").fadeIn(10, function(){
$.CalculateDimensions();
$("#imagebox").fadeIn(500, function(){
$("#ssimage").attr("src",images[count][0]);
$("#imagetext").text(images[count][1]);
$("#ssimage").load(function(){
$("#loadbox").fadeOut(10, function(){
$("#ssimage").fadeIn(500, function(){
if(jQuery.isFunction(callback)){
callback();
}
});
});
});
});
});
});
});
}
$.CalculateDimensions = function(callback) {
var width = images[count][2];
var height = images[count][3];
var doc_width = $(document).width();
var doc_height = $(document).height();
$("#showbox").height(doc_height - 50);
$("#showbox").width(doc_width - 50);
$("#imageboxwrapper").height($("#showbox").height() - $
("#sscontrols").height());
var max_height = $("#imageboxwrapper").height() - $
("#imagetext").height() - 40;
if(height > max_height){
ratio = max_height/height;
width = ratio * width;
height = ratio * height;
}
$("#ssimage").css("width",Math.floor(width));
$("#ssimage").css("height",Math.floor(height));
$("#imagetext").css("width",Math.floor(width));
$("#imagebox").css("width", Math.floor(width));
$("#loadbox").css("height", Math.floor(height));
if(jQuery.isFunction(callback)){
callback();
}
}
$.Play = function(callback) {
alert("Play");
clearTimeout(timerT);
$.NextImage(function(){
alert("Set");
clearTimeout(timerT);
timerT = setTimeout("$.Play()",4000);
if(jQuery.isFunction(callback)){
callback();
}
});
}
$.Pause = function(callback) {
clearTimeout(timerT);
$("#pause").fadeOut(200, function(){
$("#play").fadeIn(200, function(){
if(jQuery.isFunction(callback)){
callback();
}
});
});
}
$.Initialize= function(callback) {
count = 0;
$.CalculateDimensions();
$("#ssimage").attr("src",images[count][0]);
$("#imagetext").text(images[count][1]);
if(jQuery.isFunction(callback)){
callback();
}
}
$.NextImage= function(callback) {
if(count == images.length - 1){
count = 0;
} else {
count ++;
}
$.LoadImage(function(){
if(jQuery.isFunction(callback)){
callback();
}
});
}
$.PreviousImage = function(callback) {
if(count == 0){
count = images.length - 1;
} else {
count --;
}
$.LoadImage(function(){
if(jQuery.isFunction(callback)){
callback();
}
});
}
$.FirstImage = function(callback) {
count = 0;
$.LoadImage(function(){
if(jQuery.isFunction(callback)){
callback();
}
});
}
$.LastImage = function(callback) {
count = images.length - 1;
$.LoadImage(function(){
if(jQuery.isFunction(callback)){
callback();
}
});
}