Jquery mouseenter () vs mouseover ()


172

Vì vậy, sau khi đọc một câu hỏi được trả lời gần đây, tôi không rõ liệu tôi có thực sự hiểu sự khác biệt giữa mouseenter()mouseover(). Các bài viết nhà nước

Di chuột lên trên():

Sẽ kích hoạt khi vào một phần tử và bất cứ khi nào có bất kỳ chuyển động chuột nào xảy ra trong phần tử.

Chuột Entry ():

Sẽ bắn khi vào một yếu tố.

Tôi đã nghĩ ra một câu đố sử dụng cả hai và chúng có vẻ khá giống nhau. Ai đó có thể vui lòng giải thích cho tôi sự khác biệt giữa hai?

Tôi cũng đã thử đọc các định nghĩa JQuery, cả hai đều nói cùng một điều.

Sự kiện di chuột được gửi đến một phần tử khi con trỏ chuột vào phần tử

Sự kiện mouseenter được gửi đến một phần tử khi con trỏ chuột vào phần tử.

Ai đó có thể xin vui lòng làm rõ với một ví dụ?


1
Bản demo trong tài liệu cho thấy nó khá imo.
Felix Kling

2
Điều đáng chú ý là mouseenter và mouseleave chỉ là các sự kiện độc quyền trong IE và được mô phỏng trong các trình duyệt khác bởi jQuery (hiện tại chúng có trong thông số kỹ thuật mặc dù vẫn chưa được triển khai trong các trình duyệt khác. Xem quirksmode.org/dom/events/mouseover.html )
Nga Cam

Câu trả lời:


274

Bạn thấy hành vi khi phần tử đích của bạn chứa các phần tử con:

http://jsfiddle.net/ZCWvJ/7/

Mỗi lần chuột của bạn xâm nhập hoặc để lại một phần tử con, mouseoverđược kích hoạt, nhưng không mouseenter.

$('#my_div').bind("mouseover mouseenter", function(e) {
  var el = $("#" + e.type);
  var n = +el.text();
  el.text(++n);
});
#my_div {
  padding: 0 20px 20px 0;
  background-color: #eee;
  margin-bottom: 10px;
  width: 90px;
  overflow: hidden;
}

#my_div>div {
  float: left;
  margin: 20px 0 0 20px;
  height: 25px;
  width: 25px;
  background-color: #aaa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<div>MouseEnter: <span id="mouseenter">0</span></div>
<div>MouseOver: <span id="mouseover">0</span></div>

<div id="my_div">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>


2
@psychobrm - Không. Chơi với hai bản demo này cũng theo dõi mouseleavesự kiện: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 Nếu trên đó giống như nhập + rời, thì tổng số trên sẽ là tổng của số lượng nhập và rời.
gilly3

1
Có một lý do cụ thể để viết var n = + el.text();thay vì var n = el.text();? Tôi đang hỏi chỉ vì tò mò.
Fredrick Gauss

3
@FredrickGauss - Tôi đang sử dụng +toán tử để ép buộc chuỗi được trả về từ el.text()một số. Tôi có cần không? Không. Trong trường hợp này, câu lệnh tiếp theo sử dụng ncũng sẽ ép buộc nó thành một số. Vì vậy, tại sao tôi sử dụng nó? Tôi không chắc ... đây là 2 năm trước. Đó là một thói quen tốt. Nó làm cho ý định của tôi rõ ràng. Có lẽ ban đầu tôi đã có n + 1trước khi tôi lưu, nhưng đã quyết định thu nhỏ mã của mình bằng 2 ký tự và chỉ sử dụng ++n. n + 1sẽ không ép buộc nmột số, nhưng thay vào đó sẽ ép buộc 1thành một chuỗi dẫn đến đầu ra của, ví dụ 0111111.
gilly3

2
@ gilly3 - cảm ơn bạn đã giải thích chi tiết về chuyến đi của bạn trong tâm trí.
Fredrick Gauss

1
@ gilly3 Tóm tắt tốt, nhưng một cải tiến nhỏ: "hoặc để lại một phần tử con" nên "hoặc để lại một phần tử con, với điều kiện là có một khoảng cách giữa trẻ và cha mẹ. Fiddle của bạn có lề / phần đệm, và do đó, đó là sự thật rằng bất cứ khi nào bạn rời khỏi phần tử con, bạn sẽ có một sự kiện di chuột, nhưng hãy thử nó mà không có phần đệm / lề và bạn sẽ không nhận được sự kiện này.
Israel

30

Đây là một trong những ví dụ tốt nhất mà tôi đã tìm thấy:

  • chuột
  • Di chuột lên trên
  • di chuột
  • bẫy chuột

http://bl.ocks.org/mbostock/5247027


Ví dụ này khá tuyệt, nhưng bạn cần cấu trúc câu trả lời của mình nhiều hơn một chút để được nâng cao. Hãy nhớ rằng bạn đang cố gắng trả lời một câu hỏi ... nếu bạn chỉ có liên kết thì có lẽ một bình luận sẽ phù hợp hơn. Nếu bạn chưa thể bình luận vì danh tiếng, hãy lấy một số và làm điều đó sau.
scristalli

Thật ra, tôi thực sự thích câu trả lời này. Người hỏi đã đưa ra các định nghĩa về mouseover và mouseenter. Họ đã yêu cầu một ví dụ, và ví dụ này cho thấy cách họ làm việc tốt hơn nhiều so với các ví dụ khác ở đây.
patorjk 5/2/2015

Câu trả lời của gilly3 có một lỗ hổng (xem bình luận của tôi). Mặc dù không có cấu trúc tốt, câu trả lời này chỉ ra một nguồn tài nguyên tốt hơn.
Israel

14

Mặc dù chúng hoạt động theo cùng một cách, tuy nhiên, mouseentersự kiện chỉ kích hoạt khi con trỏ chuột vào phần tử được chọn . Sự mouseoverkiện được kích hoạt nếu một con trỏ chuột cũng nhập vào bất kỳ phần tử con nào .


3

Xem mã ví dụ và bản demo ở cuối trang tài liệu jquery:

http://api.jquery.com/mouseenter/

... mouseover cũng kích hoạt khi con trỏ di chuyển vào phần tử con, trong khi mouseenter chỉ kích hoạt khi con trỏ di chuyển vào phần tử bị ràng buộc.


3

Các mouseenter sự kiện khác từ mouseover trong cách nó xử lý sự kiện bọt . Sự kiện mouseenter , chỉ kích hoạt trình xử lý của nó khi chuột vào phần tử mà nó bị ràng buộc, không phải là hậu duệ . Tham khảo: https://api.jquery.com/mouseenter/

Các MouseLeave sự kiện khác từ mouseout trong cách nó xử lý sự kiện bọt . Sự kiện mouseleave , chỉ kích hoạt xử lý của nó khi chuột rời khỏi phần tử mà nó bị ràng buộc, không phải là hậu duệ . Tham khảo: https://api.jquery.com/mouseleave/


2

Ví dụ này cho thấy sự khác biệt giữa các sự kiện mousemove , mouseentermouseover :

https://jsfiddle.net/z8g613yd/

HTML:

<div onmousemove="myMoveFunction()">
    <p>onmousemove: <br> <span id="demo">Mouse over me!</span></p>
</div>

<div onmouseenter="myEnterFunction()">
    <p>onmouseenter: <br> <span id="demo2">Mouse over me!</span></p>
</div>

<div onmouseover="myOverFunction()">
    <p>onmouseover: <br> <span id="demo3">Mouse over me!</span></p>
</div>

CSS:

div {
    width: 200px;
    height: 100px;
    border: 1px solid black;
    margin: 10px;
    float: left;
    padding: 30px;
    text-align: center;
    background-color: lightgray;
}

p {
    background-color: white;
    height: 50px;
}

p span {
    background-color: #86fcd4;
    padding: 0 20px;
}

JS:

var x = 0;
var y = 0;
var z = 0;

function myMoveFunction() {
    document.getElementById("demo").innerHTML = z += 1;
}

function myEnterFunction() {
    document.getElementById("demo2").innerHTML = x += 1;
}

function myOverFunction() {
    document.getElementById("demo3").innerHTML = y += 1;
}
  • onmousemove : xảy ra mỗi khi con trỏ chuột được di chuyển qua phần tử div.
  • onmouseenter : chỉ xảy ra khi con trỏ chuột vào phần tử div.
  • onmouseover : xảy ra khi con trỏ chuột vào phần tử div và các phần tử con của nó (p và span).

bằng cách nào đó jsfiddle bị hỏng nói rằng funcitons không được xác định - Tôi vừa rẽ nhánh và chuyển tất cả js sang <script> jsfiddle.net/orc8empd
godblessstrawberry

0

Câu hỏi cũ, nhưng vẫn không có câu trả lời cập nhật tốt với imo cái nhìn sâu sắc.

Những ngày này, tất cả các trình duyệt hỗ trợ mouseover/mouseoutmouseenter/mouseleave. Tuy nhiên, jQuery không đăng ký trình xử lý của bạn mouseenter/mouseleave, nhưng âm thầm đặt chúng trên một trình bao bọc xung quanh mouseover/mouseoutnhư đoạn mã sau đây cho thấy và làm cho cách hiểu của nó hơi khác mouseenter/mouseleave.

Hành vi chính xác của các sự kiện đặc biệt có liên quan trên các trình xử lý đại biểu của Wap. Thật không may, jQuery cũng có cách hiểu khác nhau về trình xử lý đại biểu và những gì họ sẽ nhận được cho các sự kiện. Thực tế đó được thể hiện trong một câu trả lời khác cho sự kiện nhấp chuột đơn giản hơn.

Vậy làm thế nào để trả lời đúng một câu hỏi về jQuery, sử dụng từ ngữ Javascript cho các sự kiện và trình xử lý, nhưng làm cho cả hai khác nhau và thậm chí không đề cập đến điều đó trong tài liệu của nó?

Đầu tiên, sự khác biệt trong Javascript thực tế của Javascript:

  • cả hai
    • chuột có thể nhảy nhảy từ các yếu tố bên ngoài / bên ngoài sang các yếu tố bên trong / bên trong khi di chuyển nhanh hơn so với trình duyệt lấy mẫu vị trí của nó
    • bất kỳ enter/overđược một tương ứng leave/out(có thể muộn / tăng vọt)
    • các sự kiện đi đến phần tử hiển thị bên dưới con trỏ (vô hình → không thể là mục tiêu)
  • mouseenter/mouseleave
    • được gửi đến phần tử đã đăng ký (mục tiêu)
    • Bất cứ khi nào phần tử hoặc bất kỳ hậu duệ (ví dụ bằng cách nhảy) được nhập / trái
    • Nó không thể bong bóng, vì về mặt khái niệm, hậu duệ được coi là một phần của yếu tố được đề cập, tức là không có đứa trẻ nào mà sự kiện khác có thể đến từ đó (với ý nghĩa là đã nhập / rời bỏ cha mẹ?!)
    • trẻ em cũng có thể có những người xử lý tương tự đã đăng ký, nhập / nghỉ chính xác, nhưng không liên quan đến chu kỳ nhập / nghỉ của cha mẹ
  • mouseover/mouseout
    • mục tiêu là thành phần thực tế bên dưới con trỏ
      • một mục tiêu không thể là hai điều: tức là không phải cha mẹ và con cùng một lúc
    • sự kiện không thể lồng tổ
      • trước khi một đứa trẻ có thể bị vượt qua phạm vi, cha mẹ cần phải nhận được ra khỏi tinh thần
    • có thể bong bóng, vì mục tiêu / liên quanTarget chỉ ra nơi sự kiện xảy ra

Sau một số thử nghiệm, nó cho thấy rằng miễn là bạn không sử dụng các trình xử lý ủy nhiệm jQuery với đăng ký bộ chọn, thì việc mô phỏng là không cần thiết nhưng hợp lý: Nó lọc ra mouseover/mouseoutcác sự kiện mà mouseenter/mouseleavekhông thể có được. Mục tiêu là lộn xộn, mặc dù. Thực tế mouseenter/mouseleavesẽ cung cấp cho phần tử xử lý làm mục tiêu, mô phỏng có thể chỉ ra các phần tử con của phần tử đó, tức là bất cứ thứ gì mouseover/mouseoutđược mang theo.

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.