1)代码看似简单但方法链不起作用:
$('.button').on('click', function(){
$(this).removeClass('shadow').delay(500).addClass('shadow');
});
2)这个也不起作用:
$('.button').on('click' ,function() {
setTimeout(function() {
$(this).removeClass('shadow').addClass('shadow');
}, 500);
});
3)但是这个确实!
$('.button').on('click' ,function() {
var shadow = $(this).removeClass('shadow');
setTimeout(function() {
shadow.addClass('shadow');
}, 500);
});
我想问更有经验的编码员: 1有什么问题? 什么样的附加行动3变为2中已过时?这个案例颠倒了我的var理解,因为我认为var只是某种数据持有者。
答案 0 :(得分:4)
您的第一个代码段不起作用,因为.delay()
可用于延迟动画队列而不是其他代码,这是addClass
。
第二个代码段的问题是,在setTimeout
内,this
将指向窗口。所以从技术上讲,你是从窗口中删除一个类,而不是从你想要的元素中删除。为了克服这个问题,你可以做两件事,
您的第三个代码段正在运行,因为您不小心在那里创建了closure
。因此,即使在执行click事件处理程序之后,将保留您在setTimeout
内使用的变量。
这种情况的更好解决方案是,
在this
中收集setTimeout
之外的variable
并在里面使用
$('.button').on('click' ,function() {
var $this = this.removeClass('shadow');
setTimeout(function() {
$this.addClass('shadow');
}, 500);
});
使用bind
更改setTimeout
,
$('.button').on('click' ,function() {
$(this).removeClass('shadow');
setTimeout(function() {
$(this).addClass('shadow');
}.bind(this), 500);
});
或者使用最近的arrow function
,您可以这样做,
$('.button').on('click' ,function() {
$(this).removeClass('shadow');
setTimeout(() => {
$(this).addClass('shadow');
}, 500);
});
答案 1 :(得分:0)
.delay(time)
。但在您的情况下,您正在添加/删除属性/属性值。
因此,您需要使用setTimeout()
的延迟:
$('.button').on('click', function(){
var $t = $(this);
$t.removeClass('shadow');
setTimeout(function(){ $t.addClass('shadow'); }, 500);
});
setTimeout
中的匿名函数有自己的范围,$(this)
没有引用$('.button')
。shadow
变量中的元素。如果您执行以下var shadow = $(this);
检查,则最有可能发挥作用:$('.button').on('click' ,function() {
var shadow = $(this);
shadow.removeClass('shadow');
setTimeout(function() {
shadow.addClass('shadow');
}, 500);
});