【问题标题】:Why is my setInterval function not working? - Beginner为什么我的 setInterval 函数不起作用? - 初学者
【发布时间】:2016-02-12 13:13:09
【问题描述】:

在谈到 Javascript 时,我有点初学者,并且使用在这个网站上找到的示例,我拼凑了一些我能够理解但无法开始工作的简单代码。如果有人能指出我哪里出了问题,我将不胜感激,和/或在必要时解释为什么需要彻底检修。

我的目标是在“轮播”中放置 3 张图像,这些图像会在 4 秒后随着淡入/淡出而改变。我以前能够实现这一点,但无法使其循环。

$(document).ready(function () {

    setInterval(function () {
        num = (num + 1) % 3;
    }, 4000);

    if(num > 3) {
        num = 1;
    }

    if(num = 1) {
        $(".carousel #slide-1").fadeIn();
        $(".carousel #slide-2").fadeOut();
        $(".carousel #slide-3").fadeOut();
    }
    if(num = 2) {
        $(".carousel #slide-1").fadeOut();
        $(".carousel #slide-2").fadeIn();
        $(".carousel #slide-3").fadeOut();
    }
    if(num = 3) {
        $(".carousel #slide-1").fadeOut();
        $(".carousel #slide-2").fadeOut();
        $(".carousel #slide-3").fadeIn();
    }
});

【问题讨论】:

  • 它正在工作 - 除了将 num 从 0 循环到 2 之外,它没有做任何事情 - 或者可能没有,因为 num 没有在任何地方声明,所以它只是每 4 秒什么都不做,可能会发出一个控制台错误....在控制台中查找
  • 添加 HTML 将有助于获得优化的解决方案
  • 你每 4 秒做的唯一一件事是 num = ...;其余代码只运行一次
  • 声明 var num = 0 然后删除 if (num > 3 它永远不会是 0、1 或 2(查找 % 运算符)将 if (num = ? 更改为 if (num == ? 因为你需要知道赋值、= 和相等之间的区别 == ... 然后考虑 num % 3 将是 0、1 或 2 的事实 ...因此相应地更改您的 if s ...然后将 if 语句放入setinterval匿名函数,所以它们实际上是被执行的
  • 如果所有幻灯片都是直接的并且是.carousel元素的唯一子元素,var num = 0, numOfSlides = $('.carousel').children().length; setInterval(function() { $('.carousel').eq(num++ % numOfSlides).fadeIn().siblings().fadeOut(); }, 4000);

标签: javascript jquery loops optimization setinterval


【解决方案1】:

不要重复自己:

$(document).ready(function () {
    var num = 0;
    var action = function() {
        $(".carousel #slide-" + (num % 3) + 1).fadeIn();
        $(".carousel #slide-" + ((num + 1) % 3) + 1).fadeOut();
        $(".carousel #slide-" + ((num + 2) % 3) + 1).fadeOut();
        num = (num + 1);
    };
    setInterval(action, 4000);
    action();
});

或者,更好:

$(document).ready(function () {
    var slides = [
        $(".carousel #slide-1"),
        $(".carousel #slide-2"),
        $(".carousel #slide-3")
    ];
    var action = function() {
        slides[0].fadeIn();
        slides[1].fadeOut();
        slides[2].fadeOut();
        slides.push(slides.shift());
    };
    setInterval(action, 4000);
    action();
});

我最后的想法:

$(document).ready(function () {
    var slides = [].slice.call(document.querySelectorAll('.carousel [id^="slide-"]'));
    var action = function() {
        slides[0].fadeOut();
        slides[1].fadeIn();
        slides.push(slides.shift());
    };
    setInterval(action, 4000);
    slides.reduce(function(ignore, slide) { // fade out all slides after the first
        slide.fadeOut();
    });
    slide[0].fadeIn(); // fade in the first
});

【讨论】:

  • 一开始我也想过,但我觉得现在有点过头了。 :) 还是不错的选择。
  • 我自己喜欢中间解决方案,感谢提供了一些不错的选项。
  • @paxdiablo - 最后一个的美妙之处在于您无需更改代码即可更改幻灯片数量
【解决方案2】:

不要硬编码。让它充满活力。此代码将适应.carousel下任意数量的子图像。

jQuery(function($) {
  var imgs = $('.carousel > img'),
      cur = 0;
  
  imgs.slice(1).hide();
  
  setInterval(function() {
    var hidden = cur;
    
    if (++cur >= imgs.length)
      cur = 0;
    
    if (hidden !== cur) {
      imgs.eq(hidden).fadeOut();
      imgs.eq(cur).fadeIn();
    }
  }, 4000);
});
.carousel {
  position: relative;
}

.carousel > img {
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="carousel">
  <img src="//placehold.it/200x100&text=1">
  <img src="//placehold.it/200x100&text=2">
  <img src="//placehold.it/200x100&text=3">
</div>

编辑:更新为仅触摸淡入和淡出的元素。

编辑:修复了只有一张图像时发生的淡入淡出错误。

【讨论】:

  • 不错!但实际上,这是一个巨大的答案。 :)
【解决方案3】:

$(document).ready() 触发一次。它会执行您关闭中的操作,然后退出并且永远不会回来。而您的setInterval() 只是循环num 值,其余代码不再执行。

检查下面的代码。我暂时不质疑这个想法,只是改变了它的工作方式:

$(document).ready(function () {
    var num = 0;
    var action = function() {
        if(num == 0) { // note the comparison: it's ==, not =
            $(".carousel #slide-1").fadeIn();
            $(".carousel #slide-2").fadeOut();
            $(".carousel #slide-3").fadeOut();
        } else if(num == 1) {
            $(".carousel #slide-1").fadeOut();
            $(".carousel #slide-2").fadeIn();
            $(".carousel #slide-3").fadeOut();
        } else if(num == 2) {
            $(".carousel #slide-1").fadeOut();
            $(".carousel #slide-2").fadeOut();
            $(".carousel #slide-3").fadeIn();
        }       
        num = (num + 1) % 3;
    };

    setInterval(action, 4000);
    action();
});

【讨论】:

  • 这里有更好的答案。
【解决方案4】:

此时,您的重复函数只不过是循环遍历数值,因为调整 DOM 元素的代码在其之外

您应该将 所有 的代码移动到重复函数中,例如:

$(document).ready(function () {
    var num = 0;
    setInterval(function () {
        num = (num + 1) % 3;
        if(num == 0) {
            $(".carousel #slide-1").fadeIn();
            $(".carousel #slide-2").fadeOut();
            $(".carousel #slide-3").fadeOut();
            return;
        }
        if(num == 1) {
            $(".carousel #slide-1").fadeOut();
            $(".carousel #slide-2").fadeIn();
            $(".carousel #slide-3").fadeOut();
            return;
        }
        if(num == 2) {
            $(".carousel #slide-1").fadeOut();
            $(".carousel #slide-2").fadeOut();
            $(".carousel #slide-3").fadeIn();
        }
    }, 4000);
});

您也会注意到我所做的一些其他更改,希望我已经掌握了所有这些更改,但可能还有其他更改:

  • 初始化num 变量。
  • 不使用=,而是使用===== 进行平等检查。
  • 语句 num = (num + 1) % 3; 已经循环通过 {0, 1, 2},因此无需进行其他检查。
  • if 语句已修改为使用 {0,1,2} 而不是 {1,2,3}
  • return 已添加到前两个 if 块中,因为一旦您选择其中一个,就无需继续。

【讨论】:

  • 并修复代码中的基本错误 - 太棒了:p
  • 哦,我迟到了几分钟,但也差不多。 :)
  • 考虑在淡入淡出后的if 条件中使用else ifreturn
  • 我觉得else ifreturn好。
  • @Nox,这将包含在我的“可能还有其他人”的评论中。我最初的意图并不是要解决每个问题,而只是解释为什么它不起作用。其他问题从语法修复开始,但失控了。在任何情况下,初始 HTML 设置可能已经显示图像 1,而图像 2 和图像 3 不可见 - 是的,我正抓着稻草 :-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多