#javascript #html #css #loops #slideshow
#javascript #HTML #css #циклы #слайд-шоу
Вопрос:
Добрый день всем,
В настоящее время я столкнулся с проблемой здесь, на javascript.
У меня есть автоматический цикл слайд-шоу, основанный на этом http://jsfiddle.net/pdb4kb1a/2 .
Теперь у меня также есть стрелки, добавленные к изображениям, поэтому пользователь также должен иметь возможность перемещаться туда и обратно. Проблема здесь в том, что когда я вызываю onClick(), он продолжает повторно вызывать метод slideShow (n) без «прерывания» или «сброса» другого. Итак, в итоге я получаю вызов в цикле, в то время как другой все еще выполняется, что создает очень быстрый и дезориентированный цикл после нажатия кнопок со стрелками.
Как мне сбросить цикл slideShow() при вызове?
var imgArray = ['img/sleutels.jpg', 'img/naamborden.jpg', 'img/leer.jpg'];
var photoIndex = 2;
var photoId = document.getElementById('photoSlide');
function setIndex(n) {
slideShow((photoIndex n));
}
function slideShow(n) {
photoId.className = "fadeOut";
setTimeout(appear, 500);
photoIndex ;
if (photoIndex == imgArray.length) {
photoIndex = 0;
}
console.log(photoIndex);
setTimeout(slideShow, 5000);
}
function appear() {
photoId.src = imgArray[photoIndex];
photoId.className = "";
}
slideShow();
С уважением
Комментарии:
1. Можете ли вы создать демонстрацию в jsfiddle, где мы сможем увидеть проблему.
2. Вы пробовали
setIndex(2)
3. @Rajesh. это ссылка на скрипку ссылки OP. но не его рабочая проблема. правильно?
4. Да, скрипка — это то, на чем основан мой код, я счел справедливым иметь эти кредиты для этой определенной операции
Ответ №1:
Для лучшей структуры я бы вложил таймауты, затем сохранил идентификатор таймаута и очистил его:
var appearId, showId;
function setIndex(n) {
slideShow((photoIndex n));
}
function slideShow(n) {
photoId.className = "fadeOut";
photoIndex ;
if (photoIndex == imgArray.length) {
photoIndex = 0;
}
console.log(photoIndex);
if (appearId) { clearTimeout(appearId) }
appearId = setTimeout(appear, 500);
}
function appear() {
photoId.src = imgArray[photoIndex];
photoId.className = "";
if (showId) { clearTimeout(showId) }
showId = setTimeout(slideShow, 4500);
}
slideShow();
Комментарии:
1. Это сразу сработало для меня, меня просто беспокоит, что даже потратив на это несколько часов, я все равно потребовал помощи… Тем не менее, я благодарен!
2. Неплохо… Я даже не тестировал его :). Годы программирования на javascript, я помню, как был на твоем месте. Дайте ему время, это займет много лет.
3. Есть только одна вещь, которую я не до конца понимаю, когда вы говорите appearId = setTimeout(appear, 500), это также напрямую вызывает функцию? Потому что в синтаксисе это выглядит как только «заполнение» значения вместо фактического вызова.
4. Он заполняет значение идентификатором числа, т.Е. 100, Затем устанавливает тайм-аут для функции. Однако на самом деле он не выполняется до 500 мс спустя.
5. Я понимаю интервал 500, но поэтому он вызывает его при одновременном заполнении? Я родом из мира php и Java, поэтому для меня это выглядит странно, поскольку нет синтаксиса прямого выполнения, но два объединены друг с другом? Я прав в этом?
Ответ №2:
Вы пытались сохранить время ожидания слайд-шоу в переменной и сбросить его в onclick? Что-то вроде этого :
var imgArray = [
'http://placehold.it/300x200',
'http://placehold.it/200x100',
'http://placehold.it/400x300'],
curIndex = 0;
imgDuration = 3000;
var slideTimeout;
document.getElementById('nextButton').addEventListener('click', onNextClick);
function slideShow() {
document.getElementById('slider').className = "fadeOut";
setTimeout(function() {
document.getElementById('slider').src = imgArray[curIndex];
document.getElementById('slider').className = "";
},1000);
nextIndex();
slideTimeout = setTimeout(slideShow, imgDuration);
}
slideShow();
function onNextClick(domEvent){
if (slideTimeout)
clearTimeout(slideTimeout);
nextIndex();
slideShow();
}
function nextIndex(){
curIndex ;
if (curIndex == imgArray.length) { curIndex = 0; }
}
#nextButton{
background-color: #aaa;
padding:4px 12px;
margin-bottom: 20px;
}
#slider {
opacity:1;
transition: opacity 1s;
display: block;
}
#slider.fadeOut {
opacity:0;
}
<span id="nextButton">NEXT</span>
<img id="slider" src="http://placehold.it/50x200">
Все еще нужно изменить некоторый код, потому что мне не очень нравится, как вы обрабатываете индекс, но он работает… Вам просто нужно улучшить этот код для обработки «предыдущего» изображения, и вы получите то, что хотите 😉 Надеюсь, это поможет
Комментарии:
1. Это пришло на ум на короткое время, но я больше не мог сосредоточиться на его разработке. Спасибо, я попробую!
2. К сожалению, я продолжаю находиться в том же цикле, может быть, я не правильно понял «Установить новый идентификатор»? Потому что здесь я устанавливаю slideshow_timeout = setTimeout(слайд-шоу, 5000) и вызываю слайд-шоу.
3. Я обновил свой пост, используя ваш фрагмент, чтобы проиллюстрировать, что я имел в виду 😉 Дайте мне знать, если у вас есть вопросы
4. Большое вам спасибо, я действительно ценю ваши усилия 🙂
5. Причина, по-видимому, остается менее эффективной в некотором смысле, потому что я студент и хочу точно знать, что происходит шаг за шагом, прежде чем создавать свои собственные ярлыки. (У меня есть собственное предположение, что, когда я смогу сделать код более эффективным самостоятельно, я могу заявить, что понимаю его)