Cách tốt nhất để theo dõi onchange khi bạn nhập vào loại đầu vào = văn bản có nghĩa là văn bản?


449

Theo kinh nghiệm của tôi, input type="text" onchangesự kiện thường chỉ xảy ra sau khi bạn rời khỏi ( blur) điều khiển.

Có cách nào để buộc trình duyệt kích hoạt onchangemỗi khi textfieldthay đổi nội dung không? Nếu không, cách thanh lịch nhất để theo dõi thủ công này là gì?

Sử dụng onkey*các sự kiện không đáng tin cậy, vì bạn có thể nhấp chuột phải vào trường và chọn Dán và điều này sẽ thay đổi trường mà không cần nhập bất kỳ bàn phím nào.

setTimeoutcách duy nhất? .. Xấu xí :-)


@ Có bất kỳ cơ hội nào bạn có thể cập nhật câu trả lời được chấp nhận của mình để câu trả lời lỗi thời không được ghim lên đầu không?
Flimm

Câu trả lời:


271

Cập nhật:

Xem câu trả lời khác (2015).


Câu trả lời gốc năm 2009:

Vì vậy, bạn muốn onchangesự kiện này phát sáng khi nhấn phím, làm mờ dán? Đó là phép thuật.

Nếu bạn muốn theo dõi các thay đổi khi họ gõ, hãy sử dụng "onkeydown". Nếu bạn cần bẫy các thao tác dán bằng chuột, hãy sử dụng "onpaste"( IE , FF3 ) và "oninput"( FF, Opera, Chrome, Safari 1 ).

1 bị hỏng <textarea>trên Safari. Sử dụng textInputthay thế


22
onkeypressnên được sử dụng thay vì onkeydown. onkeydownkích hoạt khi một phím được bấm xuống. Nếu người dùng giữ phím, sự kiện sẽ chỉ kích hoạt một lần cho ký tự đầu tiên. onkeypressbắn bất cứ khi nào một char được thêm vào trường văn bản.
Fent

61
Nó không hoàn toàn kỳ diệu để tạo ra onchangelửa cho tất cả những hành động đó. <input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">sẽ làm đủ tốt cho hầu hết.
aroth

1
Còn việc xóa một số văn bản trong hộp nhập liệu bằng chuột thì sao? Tôi không nghĩ rằng điều này sẽ làm việc.
Jeevan

47
Với jquery 1.8.3, trông giống như:$().on('change keydown paste input', function() {})
Narfanator

4
@AriWais: CÓ, omg hầu hết SO nên được phản đối. Câu trả lời này là 8 tuổi . Tôi ước có một nút "không dùng nữa" cho các câu trả lời cũ như câu trả lời này và cộng đồng có thể chọn câu trả lời tốt hơn.
Lưỡi liềm tươi

658

Những ngày này nghe cho oninput. Cảm giác như onchangekhông cần mất tập trung vào yếu tố. Nó là HTML5.

Nó được hỗ trợ bởi tất cả mọi người (ngay cả điện thoại di động), ngoại trừ IE8 trở xuống. Đối với IE thêm onpropertychange. Tôi sử dụng nó như thế này:

const source = document.getElementById('source');
const result = document.getElementById('result');

const inputHandler = function(e) {
  result.innerHTML = e.target.value;
}

source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler); 
<input id="source">
<div id="result"></div>


63
Trong một thế giới luôn thay đổi như Tiêu chuẩn Web, đôi khi câu trả lời được chấp nhận có thể được thay đổi sau vài năm ... Đây là câu trả lời mới được chấp nhận cho tôi.
Erick Petrucelli

1
Hỗ trợ oninputngay cả trong IE9 mặc dù là một phần ( caniuse.com/#feat=input-event ).
Kenston Choi

Nó có thể đáng sử dụng innerTextthay innerHTMLthế cho bất kỳ đánh dấu nào không được hiển thị
Jeevan Takhar

47

Mã dưới đây hoạt động tốt với tôi với Jquery 1.8.3

HTML: <input type="text" id="myId" />

Javascript / JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});

11
Thư viện jQuery không được gắn thẻ trong câu hỏi.
John Weisz

21
Jquery là một api Javascript và tôi được đưa đến đây bằng một tìm kiếm với từ khóa Jquery, tôi không nghĩ rằng nó đáng để tạo một câu hỏi mới cho mỗi câu hỏi javascript cho câu trả lời của Jquery ...
GaelDev

12
Nếu mọi người không được phép đề xuất sử dụng thư viện trong câu trả lời, sẽ có RẤT NHIỀU câu hỏi chưa được trả lời về SO
dietbacon

3
Cháy nhiều lần. Có khả năng do thay đổi và keydown. Có khả năng đầu vào chỉ cần thiết ở đây.
mmm

1
bạn không cần keydownbởi vì nó sẽ nhân đôi giá trị của đầu vào, loại bỏ nó.
Youssef Al Subaihi

43

Javascript là không thể đoán trước và hài hước ở đây.

  • onchange chỉ xảy ra khi bạn làm mờ hộp văn bản
  • onkeyup& onkeypresskhông luôn xảy ra khi thay đổi văn bản
  • onkeydown xảy ra khi thay đổi văn bản (nhưng không thể theo dõi cắt và dán bằng nhấp chuột)
  • onpaste& oncutxảy ra với phím nhấn và thậm chí với chuột phải.

Vì vậy, để theo dõi sự thay đổi trong textbox, chúng ta cần onkeydown, oncutonpaste. Trong cuộc gọi lại của các sự kiện này, nếu bạn kiểm tra giá trị của hộp văn bản thì bạn không nhận được giá trị cập nhật vì giá trị được thay đổi sau khi gọi lại. Vì vậy, giải pháp cho vấn đề này là thiết lập chức năng thời gian chờ với thời gian chờ là 50 mili giây (hoặc có thể ít hơn) để theo dõi sự thay đổi.

Đây là một hack bẩn nhưng đây là cách duy nhất, như tôi đã nghiên cứu.

Đây là một ví dụ. http://jsfiddle.net/2BfGC/12/


4
oninputtextInputlà những sự kiện là giải pháp thực tế cho việc này, nhưng nó không được hỗ trợ bởi tất cả các trình duyệt.
Sanket Sahu

Đối với điểm đạn thứ hai tôi giả sử bạn có nghĩa onkeyuponkeydowntương tự. Cả hai đều có thể chụp các phím Ctrl, Alt, Shift và Meta. Đối với điểm đạn thứ ba tôi giả sử bạn có nghĩa là onkeypress.
Daniel Stevens

12

onkeyupxảy ra sau khi bạn gõ ví dụ tôi nhấn tkhi tôi nhấc ngón tay thì hành động xảy ra nhưng trên keydownhành động xảy ra trước khi tôi số hóa ký tựt

Hy vọng điều này là hữu ích cho một ai đó.

Vì vậy, onkeyuptốt hơn khi bạn muốn gửi những gì bạn vừa gõ bây giờ.


8

Tôi đã có một yêu cầu tương tự (trường văn bản phong cách twitter). Được sử dụng onkeyuponchange. onchangethực sự chăm sóc các hoạt động dán chuột trong khi mất tập trung từ trường.

[Cập nhật] Trong HTML5 trở lên, sử dụng oninputđể nhận các cập nhật sửa đổi ký tự theo thời gian thực, như được giải thích trong các câu trả lời khác ở trên.


Oninput hữu ích nếu bạn muốn phát hiện khi nội dung của textarea, input: text, input: password hoặc input: search đã thay đổi, vì sự kiện onchange trên các phần tử này kích hoạt khi phần tử mất tiêu điểm, không phải ngay sau khi sửa đổi .
hkasera

@hkasera Vâng, với HTML5 oninputlà con đường để đi. Nhưng, khi tôi triển khai, HTML5 không tồn tại và chúng tôi đã có IE 8 :(. Tôi đánh giá cao bản cập nhật của bạn vì nó cung cấp thông tin cập nhật cho người dùng.
Mohamel


7

Nếu bạn sử dụng CHỈ Internet Explorer, bạn có thể sử dụng điều này:

<input type="text" id="myID" onpropertychange="TextChange(this)" />

<script type="text/javascript">
    function TextChange(tBox) {
        if(event.propertyName=='value') {
            //your code here
        }
    }
</script>

Mong rằng sẽ giúp.


8
Có thể là cho một dự án nội bộ tôi đoán ... :)
eselk

94
Cảm ơn chúa tôi không sống trong ngôi nhà đó! : D
Marco Matarazzi

13
10 năm trước sẽ không có gì buồn cười trong câu này .. :(
Michał Tabor

4
Đối với tôi điều này có ích, tôi đang phát triển một dự án cho một số điện thoại di động có HĐH nhúng trong đó IE là trình duyệt duy nhất.
Anders M.

3
Nếu bạn chỉ sử dụng Internet Explorer - LOL. Làm cho ngày của tôi vào năm 2016!
Jack Black

4

có một giải pháp khá gần (không sửa tất cả các cách Dán) nhưng hầu hết trong số chúng:

Nó hoạt động cho đầu vào cũng như cho textareas:

<input type="text" ... >
<textarea ... >...</textarea>

Làm như thế này:

<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>

Như tôi đã nói, không phải tất cả các cách để Dán một sự kiện trên tất cả các trình duyệt ... tệ nhất là một số không thực hiện bất kỳ sự kiện nào, nhưng Timers thật kinh khủng khi được sử dụng cho việc đó.

Nhưng hầu hết các cách Dán được thực hiện bằng bàn phím và / hoặc chuột, do đó, thông thường một onkeyup hoặc onmouseup được kích hoạt sau khi dán, cũng onkeyup được kích hoạt khi gõ trên bàn phím.

Đảm bảo mã kiểm tra không mất nhiều thời gian ... nếu không, người dùng sẽ bị phạt kém.

Đúng vậy, mẹo là bắn vào phím và chuột ... nhưng hãy cẩn thận cả hai có thể bị bắn, vì vậy hãy ghi nhớ như vậy !!!


4

Xin vui lòng, đánh giá cách tiếp cận tiếp theo bằng JQuery:

HTML:

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

Javascript (JQuery):

$("#inputId").keyup(function(){
        $("#inputId").blur();
        $("#inputId").focus();
});

$("#inputId").change(function(){
        //do whatever you need to do on actual change of the value of the input field
});

Tôi sử dụng cùng một cách :)
khaled Dehia

Tôi nhận ra đây không phải là câu trả lời mới nhất, nhưng sẽ không làm mờ và tập trung lại đầu vào trên mỗi lần gõ phím lên vị trí con trỏ nếu nó ở bất cứ đâu ngoại trừ đầu cuối?
Michael Martin-Smucker

@ MichaelMartin-Smucker Bạn sẽ nghĩ như vậy, nhưng dường như không phải: jsfiddle.net/gsss8c6L
Clonkex

4

"đầu vào" làm việc cho tôi.

var searchBar  = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);


3

Để theo dõi từng thử ví dụ này và trước đó giảm hoàn toàn tốc độ nhấp nháy con trỏ xuống không.

<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>

</body>

onblur: sự kiện tạo ra khi thoát

onchange: sự kiện tạo ra khi thoát nếu có bất kỳ thay đổi nào được thực hiện trong inputtext

onkeydown: sự kiện tạo ra trên bất kỳ lần nhấn phím nào (đối với việc giữ phím cũng lâu)

onkeyup: sự kiện tạo ra trên bất kỳ bản phát hành khóa nào

onkeypress: giống như onkeydown (hoặc onkeyup) nhưng sẽ không phản ứng với ctrl, backsace, alt khác


1

2018 ở đây, đây là những gì tôi làm:

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);

Nếu bạn có thể chỉ ra sai sót trong phương pháp này, tôi sẽ rất biết ơn.


2
2019 ở đây, và điều này sẽ bắn nhiều lần cho mỗi lần nhấn phím. Ví dụ, xem tại đây: jsfiddle.net/sp00n82/3r4691tq/5
sp00n

1

Phương pháp 1: Thêm người nghe sự kiện cho input:

element.addEventListener("input", myFunction);

 

Phương pháp 2: Xác định thuộc oninputtính bằng JavaScript:

element.oninput = function()
{
    myFunction();
};

 

Phương pháp 3: Xác định thuộc oninputtính bằng HTML:

<input type="text" oninput="myFunction();">

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.