Phát hiện thay đổi đầu vào trong jQuery?


359

Khi sử dụng jquery .changetrên một inputsự kiện sẽ chỉ được kích hoạt khi đầu vào mất tiêu điểm

Trong trường hợp của tôi, tôi cần thực hiện cuộc gọi đến dịch vụ (kiểm tra xem giá trị có hợp lệ không) ngay khi giá trị đầu vào được thay đổi. Làm thế nào tôi có thể thực hiện điều này?


3
Những loại đầu vào? hộp văn bản? hộp kiểm? Đài? văn bản? hãy xem những gì bạn nghĩ ra cho đến nay
Patricia

Xin lỗi, đây là một kiểu nhập văn bản. Và như tôi đã nói, tôi đã thử thay đổi nhưng điều này không kích hoạt theo cách tôi cần (cho mỗi thay đổi trên văn bản trong đầu vào). Tôi cũng đã thử khóa phím nhưng để làm việc này, tôi sẽ phải theo dõi xem đầu vào có "bẩn" hay không.
Banshee

2
nếu họ đang bấm một phím, nó sẽ thay đổi 99% thời gian, bạn luôn có thể kiểm tra các phím không có trong trình xử lý sự kiện.
Patricia

Câu trả lời:


545

CẬP NHẬT để làm rõ và ví dụ

ví dụ: http://jsfiddle.net/pxfunc/5kpeJ/

Phương pháp 1. inputsự kiện

Trong các trình duyệt hiện đại sử dụng inputsự kiện này. Sự kiện này sẽ kích hoạt khi người dùng đang gõ vào trường văn bản, dán, hoàn tác, về cơ bản bất cứ lúc nào giá trị thay đổi từ giá trị này sang giá trị khác.

Trong jQuery làm điều đó như thế này

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

bắt đầu với jQuery 1.7, thay thế bindbằng on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Phương pháp 2. keyupsự kiện

Đối với các trình duyệt cũ hơn, hãy sử dụng keyupsự kiện này (sự kiện này sẽ kích hoạt khi một phím trên bàn phím được phát hành, sự kiện này có thể mang lại một loại dương tính giả vì khi "w" được giải phóng, giá trị đầu vào bị thay đổi và cả khi keyupsự kiện kích hoạt Phím "shift" được giải phóng các keyupsự kiện kích hoạt nhưng không có thay đổi nào được thực hiện đối với đầu vào.). Ngoài ra phương pháp này không kích hoạt nếu người dùng nhấp chuột phải và dán từ menu ngữ cảnh:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Phương pháp 3. Hẹn giờ ( setIntervalhoặc setTimeout)

Để giải quyết các giới hạn của keyupbạn, bạn có thể đặt bộ hẹn giờ để kiểm tra định kỳ giá trị của đầu vào để xác định thay đổi giá trị. Bạn có thể sử dụng setIntervalhoặc setTimeoutđể làm kiểm tra hẹn giờ này. Xem câu trả lời được đánh dấu cho câu hỏi SO này: sự kiện thay đổi hộp văn bản jQuery hoặc xem fiddle cho một ví dụ hoạt động bằng cách sử dụng focusblurcác sự kiện để bắt đầu và dừng bộ hẹn giờ cho một trường đầu vào cụ thể


Bạn có thể giải thích thêm về giải pháp này? Làm thế nào để tôi có được giá trị hiện tại? Làm thế nào để tôi có được điều này chỉ chạy khi thay đổi được thực hiện cho giá trị hiện tại?
Banshee

sự kiện đầu vào? không có sự kiện đầu vào nào trong jQuery (chưa) ... stackoverflow.com/q/11189136/104380
vsync

Đối với phương pháp 2 tôi thường liên kết với cả keyup thay đổi. Theo cách đó, trong trường hợp đầu vào xảy ra mà không có phím nhấn (như dán), ít nhất nó sẽ kích hoạt sự kiện khi đầu vào mất tiêu điểm.
rspeed

1
@AdiDarachi MutingObserver sẽ theo dõi các thay đổi đối với các thành phần DOM. Tuy nhiên, người dùng thay đổi dữ liệu trong trường đầu vào không kích hoạt thay đổi M mutObserver ... Tôi thiết lập trường hợp kiểm tra, chỉ một mã JS thay đổi thành thuộc tính innerTexthoặc value(mô phỏng đầu vào của người dùng) sẽ kích hoạt sự kiện MutingObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (xem console.log để ghi nhật ký sự kiện MutingObserver ). Bạn có một trường hợp thử nghiệm khác tôi có thể nhìn vào?
MikeM

1
điều này không hiệu quả khi tập lệnh thay đổi giá trị
FalcoGer

189

Nếu bạn đã có HTML5:

  • oninput (chỉ kích hoạt khi thay đổi thực sự xảy ra, nhưng thực hiện ngay lập tức)

Mặt khác, bạn cần kiểm tra tất cả các sự kiện này có thể cho thấy sự thay đổi đối với giá trị của phần tử đầu vào:

  • onchange
  • onkeyup( không keydown hoặc keypressvì giá trị của đầu vào sẽ không có tổ hợp phím mới trong đó)
  • onpaste (khi được hỗ trợ)

và có thể:

  • onmouseup (Tôi không chắc chắn về điều này)

@naomik từ thử nghiệm của tôi, nó hoạt động cho các đầu vào hộp kiểm; ngoại trừ IE / Edge. Một số trường hợp ngoại lệ khác có thể xuất hiện, nhưng sẽ thông minh hơn khi sử dụng onchange cho các loại đầu vào đó (IMHO).
HellBaby

82

Với HTML5 và không sử dụng jQuery, bạn có thể sử dụng inputsự kiện :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Điều này sẽ kích hoạt mỗi khi văn bản của đầu vào thay đổi.

Được hỗ trợ trong IE9 + và các trình duyệt khác.

Hãy thử nó sống trong một jsFiddle ở đây .



1
'thay đổi' chỉ kích hoạt khi mờ, không phải khi văn bản thay đổi. Sử dụng sự kiện 'đầu vào' để phát hiện các thay đổi văn bản.
Dermot Doherty

14

Như những người khác đã đề xuất, giải pháp trong trường hợp của bạn là đánh hơi nhiều sự kiện .
Các plugin làm công việc này thường lắng nghe các sự kiện sau:

$ input.on ('thay đổi phím nhấn phím nhấn phím mousedown bấm mouseup', handler);. bật ( 'thay đổi phím nhấn phím nhấn phím mousedown bấm chuột' , trình xử lý );

Nếu bạn nghĩ rằng nó có thể phù hợp, bạn có thể thêm focus, blurvà các sự kiện khác nữa.
Tôi đề nghị không vượt quá trong các sự kiện để lắng nghe, vì nó tải trong bộ nhớ trình duyệt các thủ tục tiếp theo để thực thi theo hành vi của người dùng.

Chú ý: lưu ý rằng việc thay đổi giá trị của một phần tử đầu vào bằng JavaScript (ví dụ: thông qua .val()phương thức jQuery ) sẽ không kích hoạt bất kỳ sự kiện nào ở trên.
(Tham khảo: https://api.jquery.com/change/ ).


tôi cũng khuyên bạn nên thêm tiêu điểm để tránh sự cố với tự động hoàn tất
binar

Tôi hiểu rồi. Tôi đã tìm kiếm và tập trung dường như chỉ được hỗ trợ bởi IE và một phần bởi Chrome, phải không?
Emanuele Del Grande

5
Chỉ là một bổ sung nhẹ, Để kích hoạt sự kiện từ jQuery, bạn có thể gọi hành động tương ứng sau .val()ví dụ: đối với sự kiện thay đổi trên trường đầu vào, bạn sẽ làm một cái gì đó như thế này ... $('#element').val(whatever).change()
techkncrat

2

Nếu bạn muốn sự kiện được kích hoạt bất cứ khi nào có gì đó thay đổi trong thành phần thì bạn có thể sử dụng sự kiện keyup .


Được rồi nhưng điều này không nhiều hơn hoặc ít hơn giống như phím tắt? Tôi sẽ phải tự kiểm tra xem đầu vào có "bẩn" không?
Banshee

@SnowJim nếu bạn chỉ muốn làm công cụ khi đầu vào thực sự thay đổi, bạn phải sử dụng onchangehoặc tự theo dõi trạng thái. keydownkhông hoạt động vì nó kích hoạt trước khi trạng thái của đầu vào bị thay đổi.
Alnitak

@Alnitak exacly và đó là lý do tại sao tôi đặt câu hỏi ở đây. Các onchange không hoạt động, là nó chỉ được ném khi rời khỏi đầu vào.
Banshee

Con voi trong phòng tất nhiên là di động. Khá chắc chắn rằng không có sự kiện bàn phím hoặc chuột sẽ được sử dụng nhiều ở đó. : p
Người hỏi

@Askdesigners Các sự kiện keyup / down vẫn hoạt động theo cùng một kiểu trên thiết bị di động.
Jivings

2

// .blur được kích hoạt khi phần tử mất tiêu điểm

$('#target').blur(function() {
  alert($(this).val());
});

// Để kích hoạt sử dụng thủ công:

$('#target').blur();

1
.change như tôi đã nói chỉ bị ném khi đầu vào mất tiêu điểm và giá trị bị thay đổi, tôi cần lấy ngay khi đầu vào (văn bản) thay đổi (ngay khi văn bản trong đầu vào được thay đổi). Blur sẽ chỉ kích hoạt khi đầu vào mất tiêu điểm.
Banshee

1

Có các sự kiện jQuery như keyupkeypress mà bạn có thể sử dụng với các phần tử HTML đầu vào. Bạn cũng có thể sử dụng sự kiện Blur () .


1
.change như tôi đã nói chỉ bị ném khi đầu vào mất tiêu điểm và giá trị bị thay đổi, tôi cần lấy ngay khi đầu vào (văn bản) thay đổi (ngay khi văn bản trong đầu vào được thay đổi). Blur sẽ chỉ kích hoạt khi đầu vào mất tiêu điểm.
Banshee

1
bạn không thể kiểm tra giá trị của đầu vào trong một keypresssự kiện một cách đáng tin cậy vì phím được nhấn sẽ không thay đổi giá trị đó.
Alnitak

0

Điều này bao gồm mọi thay đổi đối với đầu vào bằng jQuery 1.7 trở lên:

$(".inputElement").on("input", null, null, callbackFunction);
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.