Một vấn đề với sự kiện tiêu chuẩn mouseout
là nó không chỉ dừng khi con trỏ rời khỏi vùng màn hình được bao quanh bởi chu vi ngoài của phần tử, mà còn khi con trỏ di chuyển qua một số phần tử khác có trong chu vi này.Làm thế nào để đạt được hiệu ứng mouseleave với các hậu duệ không được định vị hoàn toàn?
Lý do cho sự kiện mouseleave
của jQuery là chỉ báo hiệu chỉ thời điểm con trỏ rời khỏi khu vực được bao quanh bởi chu vi ngoài của phần tử.
Thật không may, điều này dường như chỉ hoạt động nếu phần tử "cản trở" là hậu duệ của phần tử "bị che khuất". Nếu phần tử "cản trở" nằm ở vị trí tuyệt đối, thì khi chuột di chuột qua nó, sự kiện mouseleave
trên phần tử "bị che khuất" bị bắn.
Ví dụ, với đoạn HTML sau:
<div id="b-div">
<div id="d-div"><span>d</span></div>
</div>
<div id="c-div"><span>c</span></div>
... #d-div
là một bona fide-hậu duệ của #b-div
, trong khi #c-div
là không, nhưng, nhưng chúng tôi có thể tạo kiểu nó để nó "cản trở "#b-div
đều giống nhau. Điều này được minh họa trong this jsFiddle.
Nếu bây giờ một định nghĩa các sự kiện sau đây trên #b-div
:
$('#b-div').bind({
mouseenter: function() {
$(this).addClass('outlined');
},
mouseleave: function() {
$(this).removeClass('outlined');
}
});
... sau đó lơ lửng chuột trong phạm vi vành đai ngoài #b-div
's gây ra một phác thảo màu xanh xuất hiện trên vành đai này, trừ chuột là trên #c-div
.
Có cách nào để có được hiệu quả tương tự với #b-div
và #c-div
là mouseleave
đạt được với #b-div
và #d-div
?
EDIT: Tôi đã sửa ví dụ được hiển thị trong jsFiddle. Phiên bản gốc của ví dụ này cho thấy trường hợp đặc biệt không đại diện trong đó tất cả các phần tử cản trở chồng chéo với phần tử bị che khuất. Trong trường hợp đặc biệt này, hiệu ứng mong muốn có thể là được mô phỏng bằng cách xác định các sự kiện tương tự trên cả phần cản trở và các yếu tố cản trở, do đó, có hiệu lực, biến phần tử cản trở thành bản vá của phần tử bị che khuất. Điều này sẽ không hoạt động khi phần tử cản trở không được chứa hoàn toàn trong phạm vi ngoài của phần tử bị che khuất (như được chỉ ra trong jsFiddle đã sửa đổi). Nói chung, bất kỳ giải pháp nào dựa trên việc sử dụng sự kiện mouseover
trên phần tử cản trở sẽ bị lỗi, vì sự cố thực sự là ngăn (hoặc không hiệu quả) giả mạo mouseleave
trên phần tử bị che khuất.
Ý anh là như thế này -> ** https: //jsfiddle.net/adeneo/q1Lgzr4c/1/** – adeneo
@adeneo: nó quay ra rằng ví dụ minh họa ban đầu của tôi một chút trường hợp đặc biệt không đại diện; Tôi đã cập nhật ví dụ để sửa lỗi này. Xin lỗi vì điều đó. – kjo
Điều gì gần như hoạt động là kiểm tra 'e.relatedTarget' https://jsfiddle.net/p5yf0dcs/2/ Vấn đề là bây giờ bạn sẽ không mất điểm nổi bật khi thoát ra khỏi' b-div' –