【问题标题】:How do I 'reset' a method on call?如何“重置”调用方法?
【发布时间】:2016-10-18 10:06:20
【问题描述】:

大家好,

我目前在 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();

亲切的问候

【问题讨论】:

  • 你能在jsfiddle中创建一个demo,我们可以看到问题。
  • 你试过setIndex(2)
  • @Rajesh。这是OP参考的小提琴链接。但不是他的工作问题。对吗?
  • 是的,小提琴是我的代码所基于的,我发现将这些功劳归于某个 OP 是公平的

标签: javascript html css loops slideshow


【解决方案1】:

为了更好的结构,我会嵌套超时,然后存储超时的 id 并清除它:

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();

【讨论】:

  • 这立即为我工作,它让我很烦恼,即使花了几个小时我仍然需要帮助......不过我很感激!
  • 很好......我什至没有测试它:)。多年的 javascript 编程经验,我记得当时在你的鞋子里。给它时间,它需要很多年。
  • 只有一件事我不完全理解,当你说的出现Id = setTimeout(appear, 500) 这也直接调用函数?因为在语法上它看起来只是“填充”一个 val 而不是实际调用它。
  • 它用数字 id 填充 val,即 100,然后将超时设置为函数。它实际上直到 500 毫秒后才执行。
  • 我了解 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">

仍有一些代码需要更改,因为我不太喜欢您处理索引的方式,但它确实有效……您只需增强此代码以处理“上一个”图像,您就会得到您想要的; ) 希望对你有帮助

【讨论】:

  • 这件事在脑海中浮现了一会儿,但无法再集中精力解决它。谢谢,我试试看!
  • 不幸的是,我一直处于同一个循环中,也许我还没有理解“设置新 ID”对吗?因为这里是我设置 slideshow_timeout = setTimeout(slideShow, 5000) 并调用幻灯片的地方。
  • 我用你的 sn-p 更新了我的帖子来说明我的意思;)如果你有问题,请告诉我
  • 非常感谢,我非常感谢您的努力 :)
  • 在某些方面效率可能较低的原因是因为我是一名学生,并且想在我制作自己的快捷方式之前逐步了解正在发生的事情。 (我有自己的假设,当我自己可以使代码更高效时,我可以声明理解它)
猜你喜欢
  • 2012-06-25
  • 2016-06-14
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
相关资源
最近更新 更多