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/mouseout
và mouseenter/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/mouseout
như đ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/mouseout
các sự kiện mà mouseenter/mouseleave
không thể có được. Mục tiêu là lộn xộn, mặc dù. Thực tế mouseenter/mouseleave
sẽ 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.
const list = document.getElementById('log');
const outer = document.getElementById('outer');
const $outer = $(outer);
function log(tag, event) {
const li = list.insertBefore(document.createElement('li'), list.firstChild);
// only jQuery handlers have originalEvent
const e = event.originalEvent || event;
li.append(`${tag} got ${e.type} on ${e.target.id}`);
}
outer.addEventListener('mouseenter', log.bind(null, 'JSmouseenter'));
$outer.on('mouseenter', log.bind(null, '$mouseenter'));
div {
margin: 20px;
border: solid black 2px;
}
#inner {
min-height: 80px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<div id=outer>
<ul id=log>
</ul>
</div>
</body>