Sự kiện thay đổi hộp văn bản jQuery không kích hoạt cho đến khi hộp văn bản mất tiêu điểm?


133

Tôi thấy rằng sự kiện thay đổi jQuery trên một hộp văn bản không kích hoạt cho đến khi tôi nhấp vào bên ngoài hộp văn bản.

HTML:

<input type="text" id="textbox" />

JS:

$("#textbox").change(function() {alert("Change detected!");});

Xem bản demo trên JSFiddle

Ứng dụng của tôi yêu cầu sự kiện được kích hoạt trên mỗi thay đổi ký tự trong hộp văn bản. Tôi thậm chí đã thử sử dụng keyup thay thế ...

$("#textbox").keyup(function() {alert("Keyup detected!");});

... nhưng thực tế đã biết rằng sự kiện keyup không được kích hoạt khi nhấp chuột phải và dán.

Bất kỳ cách giải quyết? Là có cả hai người nghe sẽ gây ra bất kỳ vấn đề?


^^ Cái này Bạn có thể có nhiều trình xử lý sự kiện như bạn muốn.
Phục hồi Monica Cellio

Câu trả lời:


297

Liên kết với cả hai sự kiện là cách điển hình để làm điều đó. Bạn cũng có thể liên kết với sự kiện dán.

Bạn có thể liên kết với nhiều sự kiện như thế này:

$("#textbox").on('change keyup paste', function() {
    console.log('I am pretty sure the text box changed');
});

Nếu bạn muốn trở thành người phạm tội về nó, bạn cũng nên liên kết với mouseup để phục vụ cho việc kéo văn bản xung quanh và thêm một lastValuebiến để đảm bảo rằng văn bản thực sự đã thay đổi:

var lastValue = '';
$("#textbox").on('change keyup paste mouseup', function() {
    if ($(this).val() != lastValue) {
        lastValue = $(this).val();
        console.log('The text box really changed this time');
    }
});

Và nếu bạn muốn trở thành super duperpedantic thì bạn nên sử dụng bộ đếm thời gian để phục vụ cho việc tự động điền, plugin, v.v.

var lastValue = '';
setInterval(function() {
    if ($("#textbox").val() != lastValue) {
        lastValue = $("#textbox").val();
        console.log('I am definitely sure the text box realy realy changed this time');
    }
}, 500);

9
Cuối cùng có người đọc câu hỏi và trả lời toàn bộ!
Phục hồi Monica Cellio

4
.on('change keyup paste', function() {...}thực sự bắn nhiều lần! Nếu tôi gõ một ký tự, và sau đó nhấp vào bên ngoài, các sự kiện 'thay đổi' và 'keyup' đều được kích hoạt, dẫn đến chức năng được thực thi nhiều lần! Nếu tôi nhấp chuột phải và sau đó nhấp vào bên ngoài, 'thay đổi' và 'dán' đều được kích hoạt. Chết tiệt! Khi sử dụng Ctrl + V để dán và sau đó nhấp vào bên ngoài sẽ kích hoạt ba lần !!
SNag

1
@SNag có, do đó, bạn cũng nên thêm một kiểm tra bằng cách sử dụng một lastValuebiến để đảm bảo nó thực sự đã thay đổi.
Petah

1
+1. Tuy nhiên, có ràng buộc với 'thay đổi' thậm chí cần thiết ở đây không? Tôi không rõ trường hợp nào sẽ xử lý mà sẽ không được xử lý vào thời điểm nó (thay đổi) bị sa thải.
Madbreaks

1
Sự kiện dán được kích hoạt trước khi văn bản thực sự được dán
developerbmw

85

Trên các trình duyệt hiện đại, bạn có thể sử dụng các inputsự kiện :

BẢN GIỚI THIỆU

$("#textbox").on('input',function() {alert("Change detected!");});

1
Nice - Tôi đã không nhận ra điều đó. Nó có phải là một thứ HTML5 không?
Phục hồi Monica Cellio

4
Tôi rất muốn chấp nhận câu trả lời này, nhưng như bạn đã nói, đây là một giải pháp cho các trình duyệt hiện đại. Ứng dụng web của tôi được nhắm mục tiêu vào người dùng vẫn đang sử dụng IE8 và điều này không hoạt động trên IE8. :( Tôi có thể nói gì .. :(
SNag

Không kích hoạt nếu ví dụ chọn tất cả văn bản và nhấn phím xóa
jjxtra

4
$(this).bind('input propertychange', function() {
        //your code here
    });

Đây là công việc để gõ, dán, nhấp chuột phải, vv


1
Đây có vẻ là giải pháp tốt nhất vì nó không kích hoạt nhiều sự kiện nếu bạn làm gì đó như nhấn mũi tên lên trên trường số.
Justin

Giải pháp đơn giản và hiệu quả
Abdulhameed

4
if you write anything in your textbox, the event gets fired.
code as follows :

HTML:

<input type="text" id="textbox" />

JS:

<script type="text/javascript">
  $(function () {
      $("#textbox").bind('input', function() {
      alert("letter entered");
      });
   });
</script>

2

Thử cái này:

$("#textbox").bind('paste',function() {alert("Change detected!");});

Xem bản demo trên JSFiddle .


Khi câu hỏi được dán, nó không hoạt động. sự kiện không được kích hoạt khi nhấp chuột phải và dán.
Dhaval Marthak

Và những gì có liên quan đến việc sử dụng bind()?
Phục hồi Monica Cellio

anh ta nói rằng sự kiện keyup không bị kích hoạt khi nhấp chuột phải + dán vào nó, vì vậy keyupchange()có hành vi điển hình của riêng họ nên anh ta muốn thực hiện sự kiện sau đó pastecó thể là lựa chọn
Dhaval Marthak

Tất nhiên, nhưng điều đó vẫn không trả lời tại sao việc sử dụng bindthay vì on.
Phục hồi Monica Cellio

0

Hãy thử mã dưới đây:

$("#textbox").on('change keypress paste', function() {
  console.log("Handler for .keypress() called.");
});

Làm thế nào mà chụp bắt dán với chuột, như được đề cập trong câu hỏi?
Phục hồi Monica Cellio

nhấn phím là phù hợp kể từ khi anh ấy nói rằngevent to be fired on every character change in the textbox
Venkat.R

Nếu bạn đọc tất cả các câu hỏi mà bạn thấy anh ấy cũng đã nói,"...but it's a known fact that the keyup event isn't fired on right-click-and-paste."
Tái lập Monica Cellio

0

Đọc ý kiến ​​của bạn đưa tôi đến một sửa chữa bẩn. Đây không phải là một cách đúng đắn, tôi biết, nhưng có thể là một công việc xung quanh.

$(function() {
    $( "#inputFieldId" ).autocomplete({
        source: function( event, ui ) {
            alert("do your functions here");
            return false;
        }
    });
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.