Sự khác biệt giữa các sự kiện mouseover và mouseenter là gì?


152

Tôi đã luôn sử dụng mouseoversự kiện này, nhưng trong khi đọc tài liệu jQuery tôi đã tìm thấy mouseenter. Chúng dường như hoạt động chính xác như nhau.

Có sự khác biệt giữa hai loại này không, và nếu vậy thì khi nào tôi nên sử dụng chúng?
(Cũng áp dụng cho mouseoutvs mouseleave).

Câu trả lời:


117

Bạn có thể thử ví dụ sau từ trang tài liệu jQuery . Đây là một bản demo tương tác nhỏ, đẹp mắt và rất rõ ràng và bạn có thể tự mình nhìn thấy.

Nói tóm lại, bạn sẽ nhận thấy rằng một sự kiện chuột xảy ra trên một phần tử khi bạn vượt qua nó - đến từ phần tử con HOẶC cha mẹ của nó, nhưng sự kiện nhập chuột chỉ xảy ra khi chuột di chuyển từ bên ngoài phần tử này sang phần tử này.

Hoặc như các mouseover()tài liệu đưa ra:

[ .mouseover()] có thể gây ra nhiều đau đầu do sự kiện sủi bọt. Chẳng hạn, khi con trỏ chuột di chuyển qua phần tử bên trong trong ví dụ này, một sự kiện di chuột sẽ được gửi đến đó, sau đó nhỏ giọt lên bên ngoài. Điều này có thể kích hoạt trình xử lý di chuột bị ràng buộc của chúng tôi tại thời điểm không thuận lợi. Xem các cuộc thảo luận .mouseenter()cho một sự thay thế hữu ích.


39
Điều đó không đúng khi mouseenter"chỉ xảy ra khi chuột di chuyển từ phần tử cha sang phần tử". Sự kiện xảy ra khi chuột thay đổi từ bên ngoài phần tử sang bên trong nó. Không quan trọng con chuột đến từ yếu tố nào. Đúng là chuột thường đến từ bố mẹ, nhưng không phải lúc nào cũng vậy. Ví dụ, nếu cha mẹ không có phần đệm hoặc đường viền, thì chuột có thể nhập thẳng từ ông bà và mouseentervẫn sẽ bắn. Trên thực tế, nó thậm chí có thể nhập phần tử từ bên ngoài khung nhìn (nếu phần tử nằm ngay cạnh) và sự kiện vẫn kích hoạt.
callum

2
DEMO là lời giải thích tốt nhất;)
Luckylooke

thực tế, chỉ chơi xung quanh với bản demo.
Kevin Wheeler

43

Mouseenter và mouseleave không phản ứng với sự kiện sủi bọt, trong khi mouseover và mouseout thì không .

Đây là một bài viết mô tả hành vi.


6
Điều này giải thích điều đó một cách hoàn hảo: bl.ocks.org/mbostock/5247027 bắn chuột mỗi khi nó được bắn từ bên trong container, vì sự kiện sủi bọt.
Rafael Emshoff

4

Như thường đúng với những câu hỏi như thế này, Quirksmode có câu trả lời tốt nhất .

Tôi sẽ tưởng tượng rằng, bởi vì một trong những mục tiêu của jQuery là làm cho mọi thứ trở thành bất khả tri của trình duyệt, rằng việc sử dụng một trong hai tên sự kiện sẽ kích hoạt hành vi tương tự. Chỉnh sửa: nhờ các bài viết khác, bây giờ tôi thấy đây không phải là trường hợp


0
$(document).ready(function() {
$("#outer_mouseover").bind
("Mouse Over Mouse Out",function(event){
console.log(event.type," :: ",this.id);})
$("#outer_mouseenter").bind
("Mouse enter Mouse leave",function(event){
console.log(event.type," :: ",this.id);})
 });


nếu phần tử của bạn không có phần tử con, nhưng nếu phần tử đó có con, thì các cặp có hành vi hoàn toàn khác nhau. Tóm lại, nếu bạn đưa chuột của bạn vào một phần tử và sau đó vào con của nó, mouseover / mouseout sẽ kích hoạt, trong khi chỉ có mouseenter sẽ bắn vì chuột của bạn vẫn nằm trong phần tử.
ghi
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.