Làm cách nào để tải jquery .val () SAU sự kiện nhấn phím?


101

Tôi đã nhận:

$(someTextInputField).keypress(function() {
  alert($(this).val());
});

Bây giờ cảnh báo luôn trả về giá trị TRƯỚC khi nhấn phím (ví dụ: trường trống, tôi gõ 'a' và cảnh báo cho tôi ''. Sau đó tôi nhập 'b' và cảnh báo cho tôi 'a' ...). Nhưng tôi muốn giá trị SAU khi nhấn phím - làm thế nào tôi có thể làm điều đó?

Bối cảnh: Tôi muốn bật một nút ngay khi trường văn bản chứa ít nhất một ký tự. Vì vậy, tôi chạy thử nghiệm này trên mọi sự kiện nhấn phím, nhưng sử dụng val () trả về, kết quả luôn chậm hơn một bước. Sử dụng sự kiện change () không phải là một tùy chọn đối với tôi vì sau đó nút bị tắt cho đến khi bạn rời khỏi hộp văn bản. Nếu có cách tốt hơn để làm điều đó, tôi rất vui khi biết điều đó!


Nút có bị vô hiệu hóa trở lại nếu văn bản bị xóa không? Nếu vậy, có thể bạn sẽ phải gắn bó với việc nhấn phím.
Brilliand

Câu trả lời:


152

Thay đổi keypressthành keyup:

$(someTextInputField).on("keyup", function() {
  alert($(this).val());
});

keypressđược kích hoạt khi nhấn phím xuống, keyupđược kích hoạt khi thả phím.


@Brilliand Bạn nói đúng. Tôi đã thực hiện một giải pháp cho điều này, nó được đăng bên dưới.
David Oliveros

7
Làm thế nào bạn hoàn thành điều này trên thiết bị iPhone / Android? Chúng không hỗ trợ chức năng keyup.
Merijn Den Houting

4
định nghĩa về phím bấm không chính xác. đó là định nghĩa của keydown. xem quirksmode.org/dom/events/keys.html
challet

59

Ngạc nhiên là không ai đề cập đến sự kiện js "input":

$(someTextInputField).on('input', function() {
  alert($(this).val());
});

Được đề xuất.

https://developer.mozilla.org/en-US/docs/Web/Events/input


8
Chà, đây là câu trả lời cho một số câu hỏi SO chưa được trả lời / chưa được trả lời.
Ben Racicot

4
Điều này cũng tuyệt vời khi bạn cần bỏ qua việc nhấn các phím mũi tên, shift, v.v. trong trường nhập liệu.
hovado

2
caniuse.com/#search=input Hỗ trợ trình duyệt tương đối tốt. Câu trả lời tốt hơn nhiều so với việc nghe từng keyup.
James Haug

1
Nó tiết kiệm ngày của tôi! Cảm ơn bạn. Tôi đã sử dụng mã sau: $ ('. Subject_mark'). On ("input", function () {var $ th = $ (this); $ th.val ($ th.val (). Replace (/ [^ 0-9] / g, function (str) {return '';}));
arsho


5

Ngoài ra, bạn có thể sử dụng sự kiện keydown với thời gian chờ là 0.

Bằng cách đó, các thay đổi sẽ được áp dụng ngay lập tức, thay vì được áp dụng khi người dùng ngừng giữ phím.

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});

Điều này vẫn sẽ hoạt động kỳ lạ trong trường hợp nhấn giữ phím Backspace ... có lẽ nhấn phím với thời gian chờ là 0?
Brilliand

À, đừng bận tâm, OP không chỉ định điều gì sẽ xảy ra nếu trường văn bản bị xóa.
Brilliand

4

Bạn có thể muốn kết nối một onchangetrình xử lý sự kiện thay vì sử dụng bất kỳ sự kiện chính nào.

$(someTextInputField).change(function() {
    alert($(this).val());
});

Sử dụng Edit > Pastehoặc Nhấp chuột phải sau đó Dán sẽ kích hoạt sự kiện thay đổi, nhưng không phải là sự kiện quan trọng. Lưu ý rằng một số trình duyệt có thể mô phỏng một sự kiện quan trọng khi dán (mặc dù tôi không biết về bất kỳ sự kiện nào) nhưng bạn không thể tin tưởng vào hành vi đó.


4

Hãy thử một cái gì đó như sau:

$('#someField').keypress(function() {
  setTimeout(function() {
    if ($('#someField').val().length > 0)
      $('#theButton').attr('disabled', false);
  }, 1);
});

Điều đó chỉ đơn giản là giới thiệu thời gian chờ để sau khi vòng lặp sự kiện "nhấn phím" hoàn thành, mã của bạn sẽ chạy gần như ngay lập tức sau đó. Khoảng thời gian hẹn giờ ngắn như vậy (ngay cả khi được trình duyệt làm tròn) sẽ không đáng chú ý.

chỉnh sửa - hoặc bạn có thể sử dụng "keyup" như mọi người vẫn nói, mặc dù ngữ nghĩa của nó khác nhau.


Nó không phải là một vấn đề của thông minh bí ẩn . Sự kiện keyup không cung cấp cùng một kết quả. Bạn nhận được các sự kiện riêng biệt cho shift, ctrl, v.v. bằng cách gõ phím - nếu bạn muốn nhận được ký tự thực sự đang được nhập (chẳng hạn như dấu và) thay vì một loạt các sự kiện chính mà bạn phải kiểm tra trạng thái của phím shift hoặc ctrl, nhấn phím là con đường để đi.
Ripside

1
Đúng; đó là những gì tôi muốn nói bởi "ngữ nghĩa của nó là khác nhau".
Pointy
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.