Sự khác biệt giữa sự kiện "thay đổi" và "đầu vào" cho phần tử `đầu vào`


108

Ai đó có thể cho tôi biết sự khác biệt giữa changeinput sự kiện và sự kiện là gì không?

Tôi đang sử dụng jQuery để thêm chúng:

$('input[type="text"]').on('change', function() {
    alert($(this).val());
})

Nó cũng hoạt động với input thay vì change.

Có thể một số khác biệt trong sự kiện thứ tự liên quan đến tiêu điểm?


rakshasingh.weebly.com/1/post/2012/12/… Lưu ý rằng oninput không được hỗ trợ trong trình duyệt cũ hơn. Sau đó, bạn có thể sử dụng: onchange, onpaste và onkeyup như một giải pháp thay thế. PS: Sự kiện oninput cũng có lỗi trong IE9 và nó không được kích hoạt khi xóa.
A. Wolff

1
đầu vào kích hoạt thường xuyên hơn, như sau khi nhấn phím, trong khi thay đổi về cơ bản sẽ kích hoạt khi đầu vào bị mờ và giá trị không giống như khi đầu vào được lấy tiêu điểm.
dandavis

Sự inputkiện cũng chụp dán. Xem stackoverflow.com/questions/15727324/…
Antony

1
TLDR: cháy đầu vào khi bạn gõ, thay đổi lửa khi bạn nhấp bên ngoài
Muhammad Umer

Câu trả lời:


117

Theo bài đăng này :

  • oninput sự kiện xảy ra khi nội dung văn bản của một phần tử được thay đổi thông qua giao diện người dùng.

  • onchangexảy ra khi lựa chọn, trạng thái đã chọn hoặc nội dung của một phần tử đã thay đổi . Trong một số trường hợp, nó chỉ xảy ra khi phần tử bị mất tiêu điểm hoặc khi nhấn return(Enter) và giá trị đã bị thay đổi. Thuộc tính onchange có thể được sử dụng với: <input>, <select>, và <textarea>.

TL; DR:

  • oninput: bất kỳ thay đổi nào được thực hiện trong nội dung văn bản
  • onchange:
    • Nếu đó là <input />: thay đổi + mất tập trung
    • Nếu đó là một <select>: tùy chọn thay đổi

$("input, select").on("input", function () {
    $("pre").prepend("\nOn input. | " + this.tagName + " | " + this.value);
}).on("change", function () {
    $("pre").prepend("\nOn change | " + this.tagName + " | " + this.value);
}).on("focus", function () {
    $("pre").prepend("\nOn focus | " + this.tagName + " | " + this.value);
}).on("blur", function () {
    $("pre").prepend("\nOn blur | " + this.tagName + " | " + this.value);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" />
<select>
  <option>Alice</option>
  <option>Bob</option>
  <option>Carol</option>
  <option>Dave</option>
  <option>Emma</option>
</select>
<pre></pre>


7
Tôi vẫn chưa rõ về sự khác biệt giữa hai loại này. Chúng nghe rất giống với mô tả của bạn.
Justin Morgan

10
@JustinMorgan Giống như trong ví dụ JSFiddle, onchangexảy ra "khi phần tử mất tiêu điểm" trong khi oninputxảy ra trên mọi thay đổi văn bản.
Ionică Bizău

1
Sự khác biệt là sự kiện oninput xảy ra ngay sau khi giá trị của một phần tử đã thay đổi, trong khi sự thay đổi xảy ra khi phần tử mất tiêu điểm, sau khi nội dung đã được thay đổi.
NinoLopezWeb

1
Nói cách khác "đầu vào" được kích hoạt ngay lập tức khi bất kỳ nhân vật được thay đổi, xóa hoặc thêm thời gian "thay đổi" được đánh giá sau khi kiểm soát mất tập trung và chỉ xảy ra khi giá trị đã thay đổi
Adam Moszczyński

Tôi vừa thử với Chrome. onchangecũng được kích hoạt khi bạn nhấn enter trong khi vẫn lấy nét.
Rick

24
  • Kích change eventhoạt trong hầu hết các trình duyệt khi nội dung bị thay đổi và phần tử bị mất focus. Về cơ bản, nó là tổng hợp các thay đổi Nó sẽ không kích hoạt cho mọi thay đổi như trong trường hợp input event.

  • Kích input eventhoạt đồng bộ khi thay đổi nội dung cho phần tử. Như vậy, người nghe sự kiện có xu hướng sa thải thường xuyên hơn.

  • Các trình duyệt khác nhau không phải lúc nào cũng đồng ý liệu một sự kiện thay đổi có nên được kích hoạt cho một số loại tương tác nhất định hay không


Tôi không nghĩ rằng sự kiện đầu vào được đảm bảo để kích hoạt đồng bộ.
Tim Down

Ngoài ra, các phiên bản hiện tại của tất cả các trình duyệt đều hỗ trợ inputsự kiện này.
Tim Down

2
@TimDown, đó là lý do tại sao tôi nói rằng hỗ trợ trình duyệt khác nhau. Không phải ai cũng có phiên bản hiện tại của mọi trình duyệt.
Gabe

@TimDown Nó có hoạt động đồng bộ không?
Suraj Jain,

@SurajJain: Tôi không chắc, thành thật mà nói.
Tim Down

1

Tài liệu MDN có giải thích rõ ràng (không chắc khi nào nó được thêm vào):

Sự kiện thay đổi xuất hiện ở trước input, selecttextareacác yếu tố khi một thay đổi giá trị của phần tử được cam kết bởi người sử dụng. Không giống như sự kiện đầu vào, sự kiện thay đổi không nhất thiết phải được kích hoạt cho mỗi thay đổi đối với giá trị của phần tử .

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event

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.