Как мне «сбросить» метод при вызове?

#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. Причина, по-видимому, остается менее эффективной в некотором смысле, потому что я студент и хочу точно знать, что происходит шаг за шагом, прежде чем создавать свои собственные ярлыки. (У меня есть собственное предположение, что, когда я смогу сделать код более эффективным самостоятельно, я могу заявить, что понимаю его)