【问题标题】:how to set javascript interval for once如何设置一次javascript间隔
【发布时间】:2017-05-21 06:57:29
【问题描述】:

我构建了一个 jquery 轮播。但是当我快速向右滑动或向左滑动时会干扰并快速工作。我怎样才能解决这个问题? Here is uploaded project

我有设置变量,设置间隔是设置间隔的时间,项目是我的图像,幻灯片是要显示的活动图像,时钟是我的设置间隔函数。 当幻灯片更改时,我清除时钟变量,然后将其设置为超时,以便用户可以查看幻灯片并且幻灯片不会更改。

var settings = $.extend({
   interval: 5000,
   element: this.selector,
   items: ['images/1.jpg','images/2.jpg','images/3.jpg'],
   slide: 0,
   clock: 0,
}, options);

// Touch
$(settings.element + ' .primary img').on("swiperight", function () {
   nextSlide();
   pauseInterval();
   setTimeout(function () {
      if (!settings.clock)
         settings.clock = setInterval(nextSlide, settings.interval)
   }, 4000);
}).on("swipeleft", function () {
   prevSlide();
   pauseInterval();
   setTimeout(function () {
      if (!settings.clock)
         settings.clock = setInterval(prevSlide, settings.interval)
   }, 4000);
});

// Next Slide
function nextSlide() {
   settings.slide++;
   if (settings.slide >= settings.items.length) settings.slide = 0;
      $(settings.element + ' .primary img').attr('src', settings.items[settings.slide]).attr('data-slide', settings.slide);
   activeThumbnail()
}

// Prev Slide
function prevSlide() {
   settings.slide--;
   if (settings.slide < 0) settings.slide = settings.items.length;
   $(settings.element + ' .primary img').attr('src', settings.items[settings.slide]).attr('data-slide', settings.slide);
   activeThumbnail()
}

//Pause Interval
function pauseInterval() {
   clearInterval(settings.clock);
   settings.clock = 0;
}

【问题讨论】:

  • 我不明白...用户滑动,所以您暂停间隔,然后您希望间隔在 4 秒后重新开始?什么不工作? 4秒后重新启动间隔或问题是间隔不暂停?原因如果问题是“间隔不暂停”不是间隔......问题是 setTimeout 正在累积
  • 使用 clearTimeout

标签: javascript jquery


【解决方案1】:

您会发现只使用setTimout() 而不是混合使用setTimout()setInterval() 会更简单。

编写代码没有唯一的方法。这是一个:

var settings = $.extend({
    'delay': {
        'long_': 9000, // (4000 + 5000) after swiping 
        'short_': 5000 // auto
    },
    'element': this.selector,
    'items': ['images/1.jpg', 'images/2.jpg', 'images/3.jpg'], // array of Strings
    'slide': 0,
    'clock': null
}, options);

$(settings.element + ' .primary img').on('swiperight', nextSlide).on('swipeleft', prevSlide); // nice and simple

// nextSlide() and prevSlide() ...
// in auto: `delay` will be `settings.delay.short_`.
// on manual swipe: `delay` will be `undefined` and will default to `settings.delay.long_`.
function nextSlide(delay) {
    delay = (delay === undefined) ? settings.delay.long_ : delay;
    settings.slide = (settings.slide + 1) % settings.items.length;
    set(nextSlide, delay);
}
function prevSlide(delay) {
    delay = (delay === undefined) ? settings.delay.long_ : delay;
    settings.slide = (settings.slide + settings.items.length - 1) % settings.items.length;
    set(prevSlide, delay);
}

// set() does all the stuff common to nextSlide() and prevSlide().
function set(action, delay) {
    $(settings.element + ' .primary img').attr('src', settings.items[settings.slide]).attr('data-slide', settings.slide);
    activeThumbnail();
    clearTimeout(settings.clock); // relevant only after a manual swipe, but does no harm in auto.
    settings.clock = setTimeout(action.bind(null, settings.delay.short_), delay);
}

【讨论】:

  • 哇!你有很多技能。是否可以介绍一个教育视频来制作 jquery 插件?我希望努力练习成为像你这样的专业人士?
  • 我测试了它,工作正常,但是当我向右或向左滑动时,幻灯片会改变两次!我上传了我的代码并在这方面使用了你的帮助,但工作不仔细
  • 我的理解是左/右滑动应该中断“自动”旋转过程,然后在延长延迟后重新启动。对吗?
猜你喜欢
  • 2016-10-01
  • 1970-01-01
  • 2010-09-20
  • 2010-09-13
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
相关资源
最近更新 更多