- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在修改A Better Simple Slideshow具有暂停能力。我已经设法将 autoCycle() 中的暂停和取消暂停分离到它们自己的方法中(pauseCycle 和 unpauseCycle),因此我可以将它们用于暂停控制以及 autoCycle()。我创建了 addPause() 方法来生成暂停控件。 addPause() 方法成功地暂停了幻灯片放映,但在取消暂停幻灯片放映时使用 setInterval() 或传递给它的间隔变量做了一些奇怪的事情。它似乎导致另外一个 setInterval() 同时运行。代码如下:
var aFSlides = function(el, options) {
var $slideshows = document.querySelectorAll(el), // a collection of all of the slideshows
$slideshow = {},
Slideshow = {
init: function(el, options) {
this.counter = 0; // to keep track of current slide
this.interval = 0; // to control autoCycle
this.paused = 0; // to keep track of whether paused or not
this.el = el; // current slideshow container
this.$items = el.querySelectorAll('figure'); // a collection of all of the slides, caching for performance
this.numItems = this.$items.length; // total number of slides
options = options || {}; // if options object not passed in, then set to empty object
// options.auto = options.auto || false; // if options.auto object is not passed in, then set to false
this.opts = {
auto: (typeof options.auto === "undefined") ? false : options.auto,
speed: (typeof options.speed === "undefined") ? 6000 : options.speed,
pause: (typeof options.pause === "undefined") ? false : options.pause,
pauseOnHover: (typeof options.pauseOnHover === "undefined") ? true : options.pauseOnHover,
};
this.$items[0].classList.add('current'); // add .current class to first figure
if (this.opts.auto) {
this.autoCycle(this.el, this.opts.speed, this.opts.pauseOnHover);
}
if (this.opts.pause) {
this.addPause(this.el);
}
},
showCurrent: function(i) {
// increment or decrement this.counter depending on whether i === 1 or i === -1
if (i > 0) {
this.counter = (this.counter + 1 === this.numItems) ? 0 : this.counter + 1;
} else {
this.counter = (this.counter - 1 < 0) ? this.numItems - 1 : this.counter - 1;
}
// remove .show from whichever element currently has it
// http://stackoverflow.com/a/16053538/2006057
[].forEach.call(this.$items, function(el) {
el.classList.remove('current');
});
// add .show to the one item that's supposed to have it
this.$items[this.counter].classList.add('current');
},
pauseCycle: function(el, speed) {
var that = this;
interval = clearInterval(interval);
el.classList.add('paused');
},
unpauseCycle: function(el, speed) {
var that = this;
interval = window.setInterval(function() {
that.showCurrent(1); // increment & show
}, speed);
el.classList.remove('paused');
},
addPause: function(el, speed) {
var spanPause = document.createElement("span"),
docFrag2 = document.createDocumentFragment(),
that = this,
thatSpeed = speed;
spanPause.classList.add('pause');
spanPause.innerHTML = 'Pause';
docFrag2.appendChild(spanPause);
el.appendChild(docFrag2);
togglePause = function(el, speed) {
if (that.paused == 1) {
var speed = that.opts.speed;
that.unpauseCycle(el, speed);
that.paused = 0;
return that.paused;
} else if (that.paused == 0) {
var speed = that.opts.speed;
interval = clearInterval(interval);
that.pauseCycle(el, speed);
that.paused = 1;
return that.paused;
}
}
el.querySelector('.pause').addEventListener('click', function() {
togglePause(el, speed);
}, false);
},
autoCycle: function(el, speed, pauseOnHover) {
var that = this;
if (that.paused == 0) {
that.unpauseCycle(el, speed);
}
if (pauseOnHover) {
el.addEventListener('mouseover', function() {
if (that.paused == 0) {
that.pauseCycle(el, speed);
}
}, false);
el.addEventListener('mouseout', function() {
if (that.paused == 0) {
that.unpauseCycle(el, speed);
}
}, false);
} // end pauseonhover
} // end autoCycle
}; // end Slideshow object .....
// make instances of Slideshow as needed
[].forEach.call($slideshows, function(el) {
$slideshow = Object.create(Slideshow);
$slideshow.init(el, options);
});
};
/* Init for this example snippet */
var aFS56c641d29d032 = {
auto: true,
speed: 2000,
pause: true,
};
aFSlides('.aFS56c641d29d032', aFS56c641d29d032);
body {
font: 400 10px/1.3 Menlo, Courier, sans-serif;
}
figure {
display: none;
}
figure.current {
display: block;
}
figure pre {
font: 700 24px/1.3 Menlo, Courier, sans-serif;
white-space: pre;
}
span {
background: #f66;
color: #fff;
font: 700 16px/1.3 Menlo, Courier, sans-serif;
padding: 10px 20px;
display: inline-block;
}
<div id="smile-gallery" class="aFS56c641d29d032 ">
<div class="slides">
<figure class="slide" id="bna-1">
<div class="slide-content">
<pre>
________________________
| |
| |
| 0 0 |
| |
| \________/ |
| |
|________________________|
</pre>
</div>
</figure>
<figure class="slide" id="bna-2">
<div class="slide-content">
<pre>
________________________
| |
| |
| o O |
| |
| |
| ______/ |
|________________________|
</pre>
</div>
</figure>
<figure class="slide" id="bna-3">
<div class="slide-content">
<pre>
________________________
| |
| |
| ^ ^ |
| |
| |
| (EEEEE) |
|________________________|
</pre>
</div>
</figure>
<figure class="slide" id="bna-4">
<div class="slide-content">
<pre>
________________________
| |
| |
| | | |
| ____________ |
| \ / |
| \________/ |
|________________________|
</pre>
</div>
</figure>
</div>
<!-- /.slides -->
</div>
<!-- /#smile-gallery -->
<p>
Taken from <a href="https://github.com/leemark/better-simple-slideshow" target="_blank">A Better Simple Slideshow</a>.
</p>
当您运行此脚本时,如果您使用“暂停”控件,则会发生一些奇怪的事情。首先,它会暂停并禁用pauseOnHover 条件,就像它应该做的那样。然后您再次单击它,它会取消暂停并开始一次前进两张幻灯片。 PauseOnHover 再次起作用,但仅在悬停时暂停一张幻灯片的前进,因此幻灯片仍然一次前进一张幻灯片。再次单击“暂停”,它会停止前进两次,但会继续一次前进一张幻灯片(现在应该暂停)。再次单击 ,它开始一次前进三帧(如果您再次将鼠标悬停在其上,则前进两帧),依此类推。每次都会不断添加一些东西,但我不知道它是什么。请帮忙。
谢谢!
2016 年 2 月 22 日更新
Here's a JSFiddle我一直在为这个项目工作。让pause和pauseOnHover同时工作是一场噩梦。
最佳答案
区间变量需要绑定(bind)到正确的范围(this)。因此,无论您在何处引用变量“interval”,都需要在其前面加上“this”前缀。
在代码中搜索“CHANGED”以查看我在何处进行了更改。
var aFSlides = function(el, options) {
var $slideshows = document.querySelectorAll(el), // a collection of all of the slideshows
$slideshow = {},
Slideshow = {
init: function(el, options) {
this.counter = 0; // to keep track of current slide
this.interval = 0; // to control autoCycle
this.paused = 0; // to keep track of whether paused or not
this.el = el; // current slideshow container
this.$items = el.querySelectorAll('figure'); // a collection of all of the slides, caching for performance
this.numItems = this.$items.length; // total number of slides
options = options || {}; // if options object not passed in, then set to empty object
// options.auto = options.auto || false; // if options.auto object is not passed in, then set to false
this.opts = {
auto: (typeof options.auto === "undefined") ? false : options.auto,
speed: 300, // CHANGED: faster for development
//speed: (typeof options.speed === "undefined") ? 6000 : options.speed,
pause: (typeof options.pause === "undefined") ? false : options.pause,
pauseOnHover: (typeof options.pauseOnHover === "undefined") ? true : options.pauseOnHover,
};
this.$items[0].classList.add('current'); // add .current class to first figure
if (this.opts.auto) {
this.autoCycle(this.el, this.opts.speed, this.opts.pauseOnHover);
}
if (this.opts.pause) {
this.addPause(this.el);
}
},
showCurrent: function(i) {
// increment or decrement this.counter depending on whether i === 1 or i === -1
if (i > 0) {
this.counter = (this.counter + 1 === this.numItems) ? 0 : this.counter + 1;
} else {
this.counter = (this.counter - 1 < 0) ? this.numItems - 1 : this.counter - 1;
}
// remove .show from whichever element currently has it
// http://stackoverflow.com/a/16053538/2006057
[].forEach.call(this.$items, function(el) {
el.classList.remove('current');
});
// add .show to the one item that's supposed to have it
this.$items[this.counter].classList.add('current');
},
pauseCycle: function(el, speed) {
var that = this;
clearInterval(this.interval); // CHANGED: clearInterval doesn't return anything usefull
el.classList.add('paused');
},
unpauseCycle: function(el, speed) {
var that = this;
// CHANGED x2:
window.clearInterval(this.interval);
this.interval = window.setInterval(function() {
that.showCurrent(1); // increment & show
}, speed);
el.classList.remove('paused');
},
addPause: function(el, speed) {
var spanPause = document.createElement("span"),
docFrag2 = document.createDocumentFragment(),
that = this,
thatSpeed = speed;
spanPause.classList.add('pause');
spanPause.innerHTML = 'Pause';
docFrag2.appendChild(spanPause);
el.appendChild(docFrag2);
togglePause = function(el, speed) {
if (that.paused == 1) {
var speed = that.opts.speed;
that.unpauseCycle(el, speed);
that.paused = 0;
return that.paused;
} else if (that.paused == 0) {
var speed = that.opts.speed;
// CHANGED
clearInterval(that.interval);
//interval = clearInterval(that.interval);
that.pauseCycle(el, speed);
that.paused = 1;
return that.paused;
}
}
el.querySelector('.pause').addEventListener('click', function() {
togglePause(el, speed);
}, false);
},
autoCycle: function(el, speed, pauseOnHover) {
var that = this;
if (that.paused == 0) {
that.unpauseCycle(el, speed);
}
if (pauseOnHover) {
el.addEventListener('mouseover', function() {
if (that.paused == 0) {
that.pauseCycle(el, speed);
}
}, false);
el.addEventListener('mouseout', function() {
if (that.paused == 0) {
that.unpauseCycle(el, speed);
}
}, false);
} // end pauseonhover
} // end autoCycle
}; // end Slideshow object .....
// make instances of Slideshow as needed
[].forEach.call($slideshows, function(el) {
$slideshow = Object.create(Slideshow);
$slideshow.init(el, options);
});
};
/* Init for this example snippet */
var aFS56c641d29d032 = {
auto: true,
speed: 2000,
pause: true,
};
aFSlides('.aFS56c641d29d032', aFS56c641d29d032);
body {
font: 400 10px/1.3 Menlo, Courier, sans-serif;
}
figure {
display: none;
}
figure.current {
display: block;
}
figure pre {
font: 700 24px/1.3 Menlo, Courier, sans-serif;
white-space: pre;
}
span {
background: #f66;
color: #fff;
font: 700 16px/1.3 Menlo, Courier, sans-serif;
padding: 10px 20px;
display: inline-block;
}
<div id="smile-gallery" class="aFS56c641d29d032 ">
<div class="slides">
<figure class="slide" id="bna-1">
<div class="slide-content">
<pre>
________________________
| |
| |
| 0 0 |
| |
| \________/ |
| |
|________________________|
</pre>
</div>
</figure>
<figure class="slide" id="bna-2">
<div class="slide-content">
<pre>
________________________
| |
| |
| o O |
| |
| |
| ______/ |
|________________________|
</pre>
</div>
</figure>
<figure class="slide" id="bna-3">
<div class="slide-content">
<pre>
________________________
| |
| |
| ^ ^ |
| |
| |
| (EEEEE) |
|________________________|
</pre>
</div>
</figure>
<figure class="slide" id="bna-4">
<div class="slide-content">
<pre>
________________________
| |
| |
| | | |
| ____________ |
| \ / |
| \________/ |
|________________________|
</pre>
</div>
</figure>
</div>
<!-- /.slides -->
</div>
<!-- /#smile-gallery -->
<p>
Taken from <a href="https://github.com/leemark/better-simple-slideshow" target="_blank">A Better Simple Slideshow</a>.
</p>
关于javascript - 如何防止 setInterval() 倍增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496761/
这个问题已经有答案了: JavaScript closure inside loops – simple practical example (45 个回答) 已关闭 8 年前。 我试图创建多个 se
这是我的情况,我需要加快函数运行时间,所以 setInterval 不是一个明智的选择,对吧?因为每次至少要花费 4 毫秒。 所以,我可以将 setInterval 函数更改为 requestAnim
我正在尝试下面的代码,看看是否可以将 setInterval Id 存储为关联数组中唯一键的值,然后通过使用唯一值作为键来停止被调用函数中的间隔,如下所示我将 setInterval Id 作为它的值
我花了很长时间试图弄清楚如何使用具有 CSS 样式缓动功能的 Google Maps API 为折线上的符号设置动画。我让它工作 with this Gist和 this Google Maps AP
我是这里的 JS 新手,正在研究一个在给定时间段后开始的倒数计时器。基本上,当用户单击按钮时时钟开始,第二个时钟在第一个计时器用完时开始。我知道“setInterval”是完成这个的最好方法。我面临的
嗨, friend 们,我想只使用一个 setInterval 函数来运行我的代码。目前我正在使用两个 setInterval's 来实现我的目标,我们可以只使用一个 'setInterval' 来获
我的“setInterval”函数有问题,我想在将鼠标悬停在 div 上时启动该函数,但是 setInterval 在我将鼠标悬停在 div 上时第一次起作用=>如果我停留在div,它不会继续改变图片
我想展示两次:一次在你的国家,一次在日本用JS 问题是第二个 setInterval 停止了第一个,我不知道如何进行两次运行。 完整代码 In your region:
好吧,这个问题有几个问题。 首先,我要求 setTimeout() 和 setInterval() 我见过几种不同的调用方式,我想知道哪种方式最适合这种情况。 我正在制作一个 js/canvas 游戏
setInterval(function () { //======= //code //======== if(--timer&etype="; } },1000); 这里定时器结束后,而不是重定
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 5 年前。 Improv
我的前老板有一个 weird bug where when he used setInterval with a long delay interval : setInterval(func, 300
这个问题已经有答案了: How does the "this" keyword work, and when should it be used? (22 个回答) How to access the
我的印象是 setInterval("/*some code*/", time) 相当于 setInterval(function() { /*some code*/ }, time) 显然不是
我对 JavaScript 和 NodeJS 非常陌生,我只是想了解 NodeJS 中的发射器模式。当我尝试使用 setInterval 函数每秒发出一个刻度事件时,程序似乎工作正常:-
我有一个简单的 setTimeout 函数,它在特定时间运行并且工作正常: var now = new Date(); var milliTillExec = new Date(now.getFull
在本教程中,您将借助示例了解 JavaScript setInterval() 方法。 在 JavaScript 中,可以在指定的时间间隔内执行一段代码。这些时间间隔称为定时事件。 有
Js: function cometConnect(){ $.ajax({ cache:false, type:"post", d
LE2。关于如何解决此问题的任何其他想法? 我有这段代码,但不知道为什么不能正常工作: $(function autorun() { if ($("#contactForm").is(":visibl
这个问题在这里已经有了答案: How to make a setInterval stop after some time or after a number of actions? (6 个答案)
我是一名优秀的程序员,十分优秀!