Вы должны думать о том, что должен делать ваш код , а не о том, что делает пользователь, который запускает ваш код.Таким образом, вместо того, чтобы «автоматически« щелкать »», вы просто хотите, чтобы ваш код автоматически отображал следующее изображение.
Итак, первым шагом является удаление кода из обработчика click
:
function showImage(img){
$('div.feature-photo img').hide().attr('src',$(img).attr('src')).fadeIn();
}
$('#thumbs img').click(function() {
showImage(this);
});
И тогда возникает вопрос: как мне звонить showImage
каждые пять секунд со «следующим» изображением.Ну, во-первых, мы хотим вспомнить, что такое «текущее» изображение.Достаточно просто изменить наш showImage
, чтобы сделать это:
var current = null;
function showImage(img){
current = img;
$('div.feature-photo img').hide().attr('src',$(img).attr('src')).fadeIn();
}
Итак, нам просто нужен триггер, который произойдет через пять секунд.Вы можете использовать setInterval
, но я обнаружил, что действительно легко выйти из-под контроля, поэтому вместо этого я использую цепочечную серию setTimeout
, где каждый устанавливает следующий.И что было бы хорошим стимулом для этого?Ну, через пять секунд после того, как пользователь щелкнет изображение, так что, вероятно, прямо в showImage
:
var current = null;
var timer = 0;
function showImage(img){
current = img;
$('div.feature-photo img').hide().attr('src',$(img).attr('src')).fadeIn();
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(nextImage, 5000);
}
Хорошо, так как же должен выглядеть nextImage
?Я бы сказал, что мы, вероятно, хотим использовать current
, возможно:
function nextImage() {
var $current;
if (timer) {
clearTimeout(timer);
timer = 0;
}
if (current) {
$current = $(current);
next = $current.nextAll("img")[0];
if (!next) {
$current.siblings("img")[0];
}
if (next) {
showImage(next);
}
}
}
Вы можете начать все сначала, показав первое изображение:
showImage($("#thumbs img")[0]);
Так чтовсе вместе, и убедитесь, что мы обертываем его в функцию определения объема, чтобы мы не создавали глобальные символы:
(function() {
var current = null;
var timer = 0;
function showImage(img){
current = img;
$('div.feature-photo img').hide().attr('src',$(img).attr('src')).fadeIn();
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(nextImage, 5000);
}
function nextImage() {
var $current;
if (timer) {
clearTimeout(timer);
timer = 0;
}
if (current) {
$current = $(current);
next = $current.nextAll("img")[0];
if (!next) {
$current.siblings("img")[0];
}
if (next) {
showImage(next);
}
}
}
$('#thumbs img').click(function() {
showImage(this);
});
showImage($("#thumbs img")[0]);
})();
(Или вместо ванильной функции определения объема вы можете использовать jQuery ready
.)
Выше приведено довольно грубое и полностью непроверенное, но вы поняли.