2012-06-15 39 views
9

Tôi muốn chạy một hàm theo từng sửa đổi của điều khiển hộp văn bản ngay sau khi người dùng nhập. sự kiện .keyup() là tốt cho hầu hết các trường hợp.Sự kiện jQuery khi lựa chọn một mục được đề xuất trên một hộp văn bản?

Tuy nhiên, các trình duyệt (như Chrome hoặc Firefox) có thể đề xuất các mục nhập tự động hoàn thành cho điều khiển hộp văn bản (có thể do @name hoặc @id của điều khiển đầu vào đã biết).

Thật không may, tôi không thể thực hiện bất kỳ sự kiện nào dưới đây khi "nhấp vào mục nhập được đề xuất". (.keyup() cháy khi được chọn với bàn phím)

$('input#email') 
    .click(function() { console.log('click'); }) 
    .keyup(function() { console.log('keyup'); }) 
    .keydown(function() { console.log('keydown'); }) 
    .change(function() { console.log('change'); }) 
    .focus(function() { console.log('focus'); }) 
    .blur(function() { console.log('blur'); }); 

Càng nhiều càng tốt, tôi muốn tránh sử dụng một tấm séc kỳ setInterval().

Có cách nào để phát hiện sự kiện "chọn đề xuất" này không?

Trả lời

8

bind propertychange sự kiện:

$('input').bind('input propertychange', function() { 

    var input = this.value.trim(); 
    [...] 

}); 
+2

Tuyệt vời! Cảm ơn cho điều này (ngay cả khi tôi là một chút xa dự án này bây giờ). Tôi lưu ý rằng nó sẽ kích hoạt khi nhấp vào một mục được gợi ý (theo yêu cầu) nhưng không phải khi chọn nó bằng bàn phím. Việc đăng ký trình xử lý sự kiện cũng với _keyup_ có thể hữu ích khi điền vào khoảng trống này. – Myobis

5

Câu trả lời ngắn gọn là không, không có sự kiện nào để phát hiện lựa chọn đề xuất. Bạn có thể thử nhìn vào các nhà quan sát đột biến DOM nhưng tôi không chắc chắn nếu các thuộc tính cover này thay đổi, và có rất ít hỗ trợ cho API này cho đến nay.

Vì vậy, nếu bạn thực sự cần xử lý trường hợp này thì tôi nghĩ rằng setInterval là lựa chọn duy nhất của bạn.

Chỉnh sửa: 3 năm sau, bạn có thể sử dụng propertychange với jQuery như trong câu trả lời được chấp nhận mới (mà tôi giả định sử dụng các nhà quan sát đột biến dưới mui xe).

+0

Điều tra của tôi dường như hội tụ đến kết luận này .. Cảm ơn bạn đã nhập. – Myobis

+0

Bên cạnh 'setInterval', tôi nghĩ rằng một cách tiếp cận rõ ràng hơn là phát hiện khi một trường/textareas có tiêu điểm, sao chép giá trị hiện tại của nó và so sánh nó với giá trị của nó sau khi nó mất tiêu điểm. Một nhược điểm là bạn chỉ biết rằng nó đã thay đổi khi trường mất tiêu điểm. Tuy nhiên, một cách đơn giản để khắc phục điều này là thực hiện một người nghe 'thay đổi ', bên cạnh cái tôi vừa mô tả. –

0

Các sự kiện thay đổi dường như hoạt động tốt, nhưng không yêu cầu bạn phải bấm nút

2

giải pháp thay thế vô hiệu hóa tự động hoàn và xử lý các sự kiện khác như KeyUp, KeyDown vv

<input type="text" name="foo" autocomplete="off" /> 
Các vấn đề liên quan