我使用jQuery .data
来存储元素的点击次数。我可以添加到精细值,但减去会给出NaN错误。该值仅增加。我该如何解决这个问题?
HTML:
<div data-click="0">Click here</div>
JS:
$("div").on("click", function(){
console.log('Current: '+$(this).data('click'))
$(this).data('click',$(this).data('click')+1);
setTimeout(function(){
$(this).data('click',$(this).data('click')-1);
console.log('After: '+$(this).data('click'))
},1000);
});
答案 0 :(得分:10)
在setTimeout
回调中,this
没有您期望的值。保持这种方式:
var that = this;
setTimeout(function(){
$(that).data('click',$(that).data('click')-1);
console.log('After: '+$(that).data('click'))
},1000);
事实上,$(this)
在该片段中出现了很多次,缓存它听起来是个好主意。此外,它还消除了观察this
是什么的需要:
var $this = $(this);
console.log('Current: '+$this.data('click'))
$this.data('click',$this.data('click')+1);
setTimeout(function(){
$this.data('click',$this.data('click')-1);
console.log('After: '+$this.data('click'))
},1000);
答案 1 :(得分:1)
你也可以像这样在函数中设置this
的范围(通过调用bind
):
$("div").on("click", function(){
console.log('Current: '+$(this).data('click'))
$(this).data('click',$(this).data('click')+1);
setTimeout(function(){
$(this).data('click',$(this).data('click')-1);
console.log('After: '+$(this).data('click'))
}.bind(this),1000);
});