我有一个HTML控件列表,我需要将keyup
事件的监听器绑定到每个控件。一旦触发,其他一些行动应该在延迟一段时间后启动。我正在使用setTimeout
。
$(".TextBoxClass").each(function () {
$(this).keyup(function () {
alert("Id = " + $(this));
setTimeout(function () {
alert("current Id = " + $(this))
}, 50);
})
})
第一条alert
消息显示触发id
事件的控件的正确keyup
。 alert
中的第二个setTimeout
表示current id = [object][object]
。
如何在setTimeout
回调函数中访问控件?
答案 0 :(得分:0)
'this'标识符超出了setTimeout方法内的范围。尝试将对象引用存储在变量中并在setTimeout方法中使用,如本示例所示......
$(".TextBoxClass").each(function(){
var obj = $(this);
$(this).keyup(function () {
alert("Id = "+ obj);
setTimeout(function(){
alert("current Id = " + obj)}, 50);
});
});
答案 1 :(得分:0)
为什么不在这里处理事件功能时只使用事件对象。
$(".TextBoxClass").each(function () {
$(this).keyup(function (e) {
alert(e.target);
setTimeout(function () {
alert(e.target);
}, 50);
});
});
查看jQuery event object上的文档。
答案 2 :(得分:0)
this
关键字的值取决于您的功能范围。在外部函数范围中,this
是触发事件的DOM元素。在setTimeout
范围内,它是全局window
对象。在外部函数范围中存储对DOM元素的引用,并在稍后警告ID时使用它:
$(".TextBoxClass").keyup(function () {
var self = this;
alert("Id = " + self.id);
setTimeout(function() {
alert("current Id = " + self.id)
},50);
});
此外,没有理由进行任何迭代。 keyup
可以同时绑定到所有元素。
答案 3 :(得分:0)
<div id="controls">
<input class="TextBoxClass" type="text" value="1" id="id-1">
<input class="TextBoxClass" type="text" value="2" id="id-2">
<input class="TextBoxClass" type="text" value="3" id="id-3">
<input class="TextBoxClass" type="text" value="4" id="id-4">
<input class="TextBoxClass" type="text" value="5" id="id-5">
</div>
$('#controls').on('keyup', '.TextBoxClass', function () {
var $this = $(this);
setTimeout(function(){
// alert("current value = " + $this.val());
alert("current element id = " + $this.attr('id'));
}, 50);
});