我在一页上有多个滑块,除我无法设置和清除间隔以正常工作外,其他所有功能均正常。我正在尝试在调用next和prev函数时重置setInterval。在单击next或prev后,clearInterval起作用了,所有的滑块都停止了,但是当新的setInterval运行时,发生了奇怪的事情。
理想情况下,我想为页面上的每个滑块执行此操作,但我什至无法全局使它正常工作(这意味着立即重置页面上的所有滑块)。
感谢您的反馈!
编辑:我在实际代码下面粘贴了一个JS布局示例
gemco.customSlider = gemco.customSlider || {};
gemco.customSlider = {
nextSlide: function(el, timer){
// Set Active Slide
var parentSlide = el.parent('section');
var totalSlides = parentSlide.find($('.cs-slide')).length;
var activeSlide = parentSlide.find($('.cs-slide.active'));
var curSlide = activeSlide.data('tab');
var nextSlideIndex = curSlide + 1;
if(nextSlideIndex > totalSlides){
nextSlideIndex = 1;
}
var nextSlide = parentSlide.find($('.cs-slide[data-tab="' + nextSlideIndex + '"]'));
activeSlide.removeClass('active');
nextSlide.addClass('active');
// Reset Timer
gemco.customSlider.resetTimer(timer);
},
prevSlide: function(el, timer){
// <Similar to nextSlide>
},
playSlider: function(){
$('.custom-slider').each(function(){
var el = $(this).find('.cs-slide.active');
var parentSlide = el.parents('.custom-slider');
var totalSlides = parentSlide.find($('.cs-slide')).length;
var activeSlide = parentSlide.find($('.cs-slide.active'));
var curSlide = activeSlide.data('tab');
var nextSlideIndex = curSlide + 1;
if(nextSlideIndex > totalSlides){
nextSlideIndex = 1;
}
var nextSlide = parentSlide.find($('.cs-slide[data-tab="' + nextSlideIndex + '"]'));
activeSlide.removeClass('active');
nextSlide.addClass('active');
// Set Active Tab Link
gemco.customSlider.setActiveTabLink();
});
},
resetTimer: function(timer){
clearInterval(timer);
var timer = setInterval(function(){
gemco.customSlider.playSlider();
}, 7000);
},
init: function(){
var timer = setInterval(function(){
gemco.customSlider.playSlider();
}, 7000);
$('.cs-next-prev.next').click(function(e){
timer = timer;
el = $(this);
e.preventDefault();
gemco.customSlider.nextSlide(el, timer);
});
$('.cs-next-prev.prev').click(function(e){
// <Similar to Above>
});
}
} // gemco.customSlider
这里是JS总体布局的示例
var obj = obj || {};
obj.customSlider = obj.customSlider || {};
obj.customSlider = {
nextSlide: function(){
// ...
},
prevSlide: function(){
// ...
},
playSlider: function(){
// ...
},
resetTimer: function(){
// ...
},
init: function(){
// Init Functions
}
},
obj.sample = obj.sample || {};
obj.sample = {
init: function() {
// ...
}
}
$(document).ready(function(){
obj.customSlider.init();
obj.sample.init();
});
问题示例-JSFiddle-多次单击下一个箭头,就像每次创建新计时器一样???如果我注释掉resetTImer内的新间隔,则单击下一个按钮,我可以看到clearInterval起作用。困惑。
答案 0 :(得分:1)
在
的开头创建一个全局timer
gemco.customSlider = (function(){
var timer;// all functions use this timer only, no more others
var resetTimer=function(){...};
var setActiveTabLink=function(){...};
....
return {
Init: C,//map functions..
Next: B,
setActiveTabLink: setActiveTabLink
....
}
})();
并删除var
和resetTimer
中的init
。
我不理解开头的代码:
gemco.customSlider = gemco.customSlider || {};
gemco.customSlider = {//the first row make sure customSlider is not empty, but here overwrites the first row....
更多说明:
原因是您的timer
未清除,并且一直在后台运行。
此代码有效:https://jsfiddle.net/z1kg8qdt/29/
更改:
Module Design Pattern
应用于全局代码timer
; timer
; gemco.customSlider = gemco.customSlider || {};
JavaScript模块是最常用的设计模式 保持特定代码段独立于其他组件。 这提供了松散的耦合以支持结构良好的代码。