2014-11-09 71 views
1

我有一個HTML控件列表,我需要將一個監聽器綁定到這兩個事件中的每一個。一旦觸發了,一些其他行動應該在一段時間後被啓動。我正在使用setTimeout

$(".TextBoxClass").each(function() { 
    $(this).keyup(function() { 
    alert("Id = " + $(this));  
    setTimeout(function() { 
     alert("current Id = " + $(this)) 
    }, 50); 
    }) 
}) 

第一alert消息顯示哪個觸發事件keyup控制的正確idsetTimeout內的第二個alert表示current id = [object][object]

如何訪問setTimeout回調函數中的控件?

回答

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); 
}); 

http://jsbin.com/yisore/1/

http://jsbin.com/yisore/1/edit

0

「這個」標識超出的setTimeout method.Try範圍內的對象引用存儲在一個變量,在這個例子中使用的setTimeout方法裏面像...

$(".TextBoxClass").each(function(){ 
    var obj = $(this); 

    $(this).keyup(function() { 
     alert("Id = "+ obj); 
     setTimeout(function(){ 
      alert("current Id = " + obj)}, 50); 
    }); 
}); 
0

你爲什麼不在這裏處理事件函數時只需使用事件對象。

$(".TextBoxClass").each(function() { 
    $(this).keyup(function (e) { 
     alert(e.target); 
     setTimeout(function() { 
      alert(e.target); 
     }, 50); 
    }); 
}); 

查看關於jQuery event object的文檔。

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可以一次綁定到所有元素。