2009-09-11 36 views
28

Tôi muốn có một chức năng được chạy khi một phím nhấn xảy ra trên một hộp văn bản, vì vậy tôi có mã này:jquery bấm phím() sự kiện nhận được văn bản

$("input[x]").keypress(function() { 
     DoX(); 
    }) 

này đang làm việc tốt, nhưng trong chức năng của tôi, tôi muốn để làm một cái gì đó dựa trên giá trị văn bản trong textbox

var textValue = ("input[x]").val(); 

Bây giờ vấn đề ở đây là nó đứng sau bởi một chìa khóa vì vậy nếu hộp văn bản của tôi nói 'Anh' và tôi gõ một 'l', sau đó tôi muốn textValue của tôi là 'Hel', nhưng nó trả về giá trị trước đó 'He' vì có lẽ nhân vật chưa được đặt trong hộp văn bản.

Có cách nào để 'thoát' chức năng của tôi ở đây không?

Cảm ơn :)

Trả lời

51

Bạn có thể cố gắng sử dụng các sự kiện KeyUp:

$(selector).keyup(function() { 
    var textValue = $(this).val(); 
    DoX(); 
}); 
9

Sử dụng onkeyup, nó sẽ hiển thị đúng giá trị.

27

nếu bạn đang bị mắc kẹt bằng cách sử dụng keyPressed đối với một số lý do nào khác (vì vậy bạn không thể thay đổi để KeyUp như đề xuất), sau đó bạn có thể nhận các ký tự cuối cùng gõ như này:

$("input[x]").keypress(function (e) { 
    var c = String.fromCharCode(e.which); 
    //process the single character or 
    var textValue = $("input[x]").val(); 
    var fulltext = textValue + c; 
    //process the full text 

}); 
+2

'(" đầu vào [x] ") val()' phải là: '$ (" đầu vào [x] "). Val()' hoặc thậm chí tốt hơn: '$ (this) .val() 'hoặc thậm chí tốt hơn:' this.value' –

+0

@Oleg G Cảm ơn. –

+6

Một lời cảnh báo sau khi tôi gặp phải vấn đề với cách tiếp cận này - nó giả định con trỏ luôn ở cuối văn bản hộp văn bản. Ví dụ: nếu bạn nhập E-S-T-Home-T, trong cửa sổ trình chỉnh sửa bình thường, bạn sẽ nhận được "TEST", nhưng JS này sẽ dẫn đến "ESTT". –

0

Sử dụng setTimeout không chậm trễ. Nó sẽ chạy ngay sau khi sự kiện nhấn phím hoàn tất, do đó bạn sẽ có giá trị chính xác của đầu vào.

$("input[x]").keypress(function() { 
    setTimeout(DoX); 
}); 
Các vấn đề liên quan