我有以下代码:
$(document).ready(function() {
$('button').each(function(index){
var time = index * 1000;
setInterval(function(){
$(this).toggleClass('one two');
}, time);
});
});
这应该在设定的间隔时间内在两个类之间循环,但它不起作用。为什么呢?
答案 0 :(得分:2)
您的代码不起作用,因为JavaScript使用的是一个名为lexical scoping的概念。这定义了如何在嵌套函数中解析变量名称。
在您的情况下$(this)
不是您认为的那样。将匿名函数传递给setInterval时,this
绑定到setInterval
。 JavaScript中最重要的概念之一是范围如何绑定到“this”。
https://jsfiddle.net/00w2ythq/1/
$('button').each(function(index){
var time = index * 1000;
var button = $(this); // this is bound to .each()
setInterval(function(){
// scope changed, this is bound to window
button.toggleClass('one');
}, time);
});
答案 1 :(得分:1)
在您的代码this
中引用setInterval function scope
,因此为了引用您需要将其分配给另一个变量的按钮
$('button').each(function(index){
var time = index * 1000;
var self = $(this);
setInterval(function(){
self.toggleClass('one');
}, time);
});
<强> JSFIDDLE 强>
答案 2 :(得分:0)
内部setInterval回调this
引用window
对象而不是元素对象。因此,要么将引用存储在变量中,就像在另一个答案中一样,并在回调中使用它,或者使用 Function.prototype.bind()
将this
上下文绑定到setInterval
回调函数
$(document).ready(function() {
$('button').each(function(index){
var time = index * 1000;
setInterval(function(){
$(this).toggleClass('one');
}.bind(this), time);
});
});
$(document).ready(function() {
$('button').each(function(index) {
var time = index * 1000;
setInterval(function() {
$(this).toggleClass('one');
}.bind(this), time);
});
});
.one {
background: #000
}
.two {
background: #f00
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button class="one">Button</button>
<button class="one">Button</button>
<button class="one">Button</button>
<button class="one">Button</button>
<button class="one">Button</button>
<button class="one">Button</button>
对于较旧的浏览器,请检查polyfill option for bind method。