sự kiện 'đầu vào' của jQuery


206

Tôi chưa bao giờ nghe về một sự kiện trong jQuery được gọi inputcho đến khi tôi thấy jsfiddle này .

Bạn có biết tại sao nó hoạt động? Nó là một bí danh cho keyuphay cái gì đó?

$(document).on('input', 'input:text', function() {});


12
Ngoại trừ changechỉ bắn một khi lĩnh vực đã mất tập trung. inputcháy ngay lập tức.
jcsanyi

3
Bạn đã thử tìm kiếm nó?
không xác định

2
@und xác định Có tôi có, nếu không tôi sẽ không tạo ra một câu hỏi cho nó. Điều duy nhất xuất hiện trên Google là các bài viết về input yếu tố này và cách đính kèm các sự kiện với nó.
lửa lụa

3
Câu hỏi này trả lời đẹp tất cả các khái niệm - stackoverflow.com/questions/15727324/ từ
GemK

Câu trả lời:


196

Xảy ra khi nội dung văn bản của một yếu tố được thay đổi thông qua giao diện người dùng.

Đây không hẳn là bí danh keyupkeyupsẽ kích hoạt ngay cả khi phím không làm gì (ví dụ: nhấn và sau đó nhả phím Control sẽ kích hoạt keyupsự kiện).

Một cách tốt để suy nghĩ về nó là như thế này: đó là một sự kiện kích hoạt bất cứ khi nào đầu vào thay đổi. Điều này bao gồm - nhưng không giới hạn ở - nhấn các phím sửa đổi đầu vào (ví dụ, Ctrlbản thân nó sẽ không kích hoạt sự kiện, nhưng Ctrl-Vđể dán một số văn bản sẽ), chọn tùy chọn tự động hoàn thành, ở giữa kiểu Linux -nhấp dán, kéo và thả, và nhiều thứ khác.

Xem này trang và các ý kiến về câu trả lời này để biết thêm chi tiết.


11
Bạn có biết nếu jQuery tạo ra sự hỗ trợ trình duyệt bị thiếu? (IE8, IE9 không nhất quán, v.v.)
jcsanyi

4
Tôi chỉ googled 'sự kiện đầu vào js'. Có một mẹo để biết những thuật ngữ nào sẽ được sử dụng để tìm thấy những gì bạn muốn trên google; nó đi kèm với kinh nghiệm Và sau đó, tất nhiên, google ghi lại mọi thứ và sử dụng nó để tìm hiểu những gì bạn thực sự muốn. Hầu hết các tìm kiếm của tôi là cho các tài liệu API và các câu hỏi lập trình, do đó, theo thời gian, khi tôi tìm kiếm các thứ, nó có thể hiển thị cho tôi các tài liệu API và các câu trả lời lập trình.
J David Smith

3
Chà, tôi đã tìm kiếm "sự kiện đầu vào jQuery", tôi không biết đó là một sự kiện JS gốc. Tương tự ở đây, kết quả đầu tiên thường là từ SO, mà tôi coi chủ yếu là câu trả lời thực tế / nguồn thông tin chính thức.
lửa lụa

18
inputthực sự không chỉ là một bộ lọc keyup, ví dụ, nó cũng sẽ kích hoạt khi giá trị được chọn từ danh sách các giá trị được sử dụng trước đó ... Đó là điều rất khó xử lý nếu không có inputsự kiện.
szeryf

2
oninputcũng kích hoạt khi văn bản được thay đổi bằng chuột (thông qua kéo và thả hoặc qua menu chuột phải hoặc nhấp chuột giữa để dán).
Denilson Sá Maia

157

oninput sự kiện này rất hữu ích để theo dõi các thay đổi của trường đầu vào.

Tuy nhiên, nó không được hỗ trợ trong phiên bản IE <9. Nhưng các phiên bản IE cũ hơn có sự kiện độc quyền riêng onpropertychangegiống như vậy oninput.

Vì vậy, bạn có thể sử dụng nó theo cách này:

$(':input').on('input propertychange');

Để có một hỗ trợ crossbrowser đầy đủ.

Vì trao đổi thuộc tính có thể được kích hoạt cho BẤT K change thay đổi thuộc tính nào, ví dụ, thuộc tính bị vô hiệu hóa được thay đổi, nên bạn muốn thực hiện bao gồm:

$(':input').on('propertychange input', function (e) {
    var valueChanged = false;

    if (e.type=='propertychange') {
        valueChanged = e.originalEvent.propertyName=='value';
    } else {
        valueChanged = true;
    }
    if (valueChanged) {
        /* Code goes here */
    }
});

10
Chính xác những gì tôi cần. Cảm ơn bạn. (Tôi ghét phải hỗ trợ <IE9.)
DaleyKD

Một số thông tin khác: "Opera không kích hoạt sự kiện đầu vào sau khi thả văn bản vào trường nhập. IE 9 không kích hoạt sự kiện đầu vào khi người dùng xóa các ký tự khỏi đầu vào được điền bởi bàn phím, cắt hoặc kéo các thao tác." developer.mozilla.org/en-US/docs/Web/Events/ từ
tkane2000

Có một vấn đề với mã này. Nếu maxlength được đặt trên phần tử đầu vào, sự kiện 'đầu vào' được kích hoạt ngay cả khi đạt đến độ dài tối đa và giá trị không thay đổi
nivcaner

Nhưng tại sao không chỉ là hai chức năng riêng biệt? Bằng cách đó, không cần kiểm tra loại sự kiện hoặc tên tài sản. Mã có thể là trong một chức năng chia sẻ thứ ba.
ADTC

17

Sử dụng jQuery, các hiệu ứng sau giống hệt nhau:

$('a').click(function(){ doSomething(); });
$('a').on('click', function(){ doSomething(); });

inputTuy nhiên, với sự kiện này, chỉ có mẫu thứ hai dường như hoạt động trong các trình duyệt tôi đã thử nghiệm.

Do đó, bạn mong muốn nó hoạt động, nhưng nó KHÔNG (ít nhất là hiện tại):

$(':text').input(function(){ doSomething(); });

Một lần nữa, nếu bạn muốn tận dụng ủy quyền sự kiện (ví dụ: để thiết lập sự kiện vào #containertrước khi bạn input.textđược thêm vào DOM), điều này sẽ xuất hiện trong tâm trí:

$('#container').on('input', ':text', function(){ doSomething(); });

Đáng buồn thay, một lần nữa, nó hiện không hoạt động!

Chỉ mẫu này hoạt động:

$(':text').on('input', function(){ doSomething(); });

EDITED VỚI THÔNG TIN HIỆN TẠI

Tôi chắc chắn có thể xác nhận rằng mô hình này:

$('#container').on('input', ':text', function(){ doSomething(); });

NGAY BÂY GIỜ cũng hoạt động, trong tất cả các trình duyệt 'tiêu chuẩn'.


2

Như Stewustrofob đã nói, oninput được hỗ trợ cho IE9 +.

Tuy nhiên , "Sự kiện oninput bị lỗi trong Internet Explorer 9. Nó không được kích hoạt khi các ký tự bị xóa khỏi trường văn bản thông qua giao diện người dùng chỉ khi các ký tự được chèn. Mặc dù sự kiện onpropertychange được hỗ trợ trong Internet Explorer 9, nhưng tương tự như sự kiện oninput, nó cũng có lỗi, nó không bị xóa khi xóa.

Vì các ký tự có thể bị xóa theo nhiều cách (Backspace và Xóa các phím, lệnh CTRL + X, Cut và Delete trong menu ngữ cảnh), không có giải pháp tốt nào để phát hiện tất cả các thay đổi. Nếu các ký tự bị xóa bởi lệnh Xóa của menu ngữ cảnh, sửa đổi có thể được phát hiện trong JavaScript trong Internet Explorer 9. "

Tôi có kết quả tốt khi liên kết với cả đầu vào và keyup (và keydown, nếu bạn muốn nó chạy trong IE trong khi giữ phím Backspace).



1

Tôi nghĩ rằng 'đầu vào' chỉ đơn giản hoạt động ở đây giống như cách 'oninput' trong Mô hình sự kiện cấp độ DOM.

Ngẫu nhiên:

Giống như Silkfire đã nhận xét nó, tôi cũng đã googled cho 'sự kiện đầu vào jQuery'. Do đó, tôi đã được dẫn đến đây và kinh ngạc khi biết rằng 'đầu vào' là một tham số có thể chấp nhận được đối với lệnh bind () của jquery . Trong jQuery in Action (trang 102, 2008 ed.) 'Input' không được đề cập đến như một sự kiện có thể xảy ra (đối với 20 người khác, từ 'mờ' đến 'unload'). Đúng là trên p. 92, điều ngược lại có thể được phỏng đoán từ việc đọc lại (nghĩa là từ một tham chiếu đến các mã định danh chuỗi khác nhau giữa các mô hình Cấp 0 và Cấp 2). Điều đó khá sai lệch.


Cảm ơn cho đầu vào (không có ý định chơi chữ), đây dường như là một chủ đề chính thức! :)
tằm lửa

0

jQuery có chữ ký sau cho .on()phương thức:.on( events [, selector ] [, data ], handler )

Sự kiện có thể là bất cứ ai trong số những người được liệt kê trong tài liệu tham khảo này:

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

Mặc dù vậy, chúng không phải là tất cả các trình duyệt được hỗ trợ.

Mozilla tuyên bố như sau về sự kiện đầu vào:

Sự kiện đầu vào DOM được kích hoạt đồng bộ khi giá trị của một hoặc phần tử được thay đổi. Ngoài ra, nó kích hoạt các trình soạn thảo có thể chỉnh sửa nội dung khi nội dung của nó được thay đổi.


-8
$("input#myId").bind('keyup', function (e) {    
    // Do Stuff
});

làm việc trong cả IE và chrome


bindkhông được dùng nữa, sử dụngon
Tushar
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.