Tôi chỉ muốn chia sẻ một cái gì đó với bạn.
Tôi có một số thời gian khó khăn với ng-mouseenter
và ng-mouseleave
các sự kiện.
Nghiên cứu trường hợp:
Tôi đã tạo một menu điều hướng nổi, chuyển đổi khi con trỏ ở trên một biểu tượng.
Menu này ở trên cùng của mỗi trang.
- Để xử lý chương trình / ẩn trên menu, tôi chuyển một lớp.
ng-class="{down: vm.isHover}"
- Để chuyển đổi vm.isHover , tôi sử dụng các sự kiện chuột ng.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Hiện tại, mọi thứ đều ổn và hoạt động như mong đợi.
Giải pháp là sạch sẽ và đơn giản.
Vấn đề đến:
Trong một cái nhìn cụ thể, tôi có một danh sách các yếu tố.
Tôi đã thêm một bảng điều khiển hành động khi con trỏ ở trên một phần tử của danh sách.
Tôi đã sử dụng mã giống như trên để xử lý hành vi.
Vấn đề:
Tôi đã tìm ra khi con trỏ của tôi ở trên menu điều hướng nổi và cũng ở trên cùng của một phần tử, có một xung đột giữa nhau.
Bảng điều khiển hành động xuất hiện và điều hướng nổi được ẩn.
Vấn đề là ngay cả khi con trỏ ở trên menu điều hướng nổi, phần tử danh sách ng-mouseenter được kích hoạt.
Nó không có ý nghĩa với tôi, bởi vì tôi sẽ mong đợi một sự phá vỡ tự động của các sự kiện lan truyền chuột.
Tôi phải nói rằng tôi đã thất vọng và tôi dành thời gian để tìm hiểu vấn đề đó.
Suy nghĩ đầu tiên:
Tôi đã thử sử dụng những thứ này:
$event.stopPropagation()
$event.stopImmediatePropagation()
Tôi đã kết hợp rất nhiều sự kiện con trỏ ng (mousemove, mouveover, ...) nhưng không có gì giúp tôi.
Giải pháp CSS:
Tôi tìm thấy giải pháp với một thuộc tính css đơn giản mà tôi sử dụng ngày càng nhiều:
pointer-events: none;
Về cơ bản, tôi sử dụng nó như thế (trên các yếu tố danh sách của tôi):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
Với thủ thuật phức tạp này, các sự kiện ng-mouse sẽ không còn được kích hoạt và menu điều hướng nổi của tôi sẽ không còn tự đóng khi con trỏ ở trên nó và trên một phần tử trong danh sách.
Để đi xa hơn:
Như bạn có thể mong đợi, giải pháp này hoạt động nhưng tôi không thích nó.
Chúng tôi không kiểm soát các sự kiện của mình và điều đó thật tệ.
Thêm vào đó, bạn phải có quyền truy cập vào vm.isHover
phạm vi để đạt được điều đó và nó có thể không thể hoặc có thể nhưng bẩn theo cách này hay cách khác.
Tôi có thể làm cho một fiddle nếu ai đó muốn nhìn.
Tuy nhiên, tôi không có giải pháp nào khác ...
Đó là một câu chuyện dài và tôi không thể cho bạn một củ khoai tây vì vậy xin hãy tha thứ cho tôi, bạn của tôi.
Dù sao, pointer-events: none
là cuộc sống, vì vậy hãy nhớ nó.