[英]Why mouseleave event got triggered by autocomplete input
我有一個帶有事件 mouseleave 附加到它的 div。 div 內部有一個表單。
<div class='dropdown'>
<form>
<input type='email' name='email' placeholder='email'/>
</form>
</div>
當我單擊輸入並且瀏覽器顯示自動完成列表時,問題就來了。
如果我將 cursor 移動到 select 正確的 email。mouseleave 觸發事件,但我沒有離開 div,我只是因為自動完成似乎是瀏覽器外部的東西,所以我得到了這種不希望的行為。
關於如何檢測這種情況的任何建議?
我只需要香草 javascript 響應(但如果你有 jquery 方法就可以了,所以我可以檢查后面的代碼)
提前致謝
如果您有有效的代碼片段,那將會很有幫助。 考慮到您提供的信息,讓我總結一下問題。
雖然你的目標是:
您的問題有兩種解決方案:
請參閱以下代碼片段以了解解決方案 #2。
function generateHappyMeals (nodeName) { console.log('HAPPY MEALS from', nodeName); }; function MouseTrack(e) { // Target nodeName represent the node name of the target element // Based on HTML example, when you move out your cursor, you should have three nodenames: DIV, FORM, INPUT which represent the target element that triggers the MouseTrack function. const nodeName = e.target.nodeName; // console.log(nodeName); if (nodeName === 'DIV') { // Do something when mouse event triggered by #card div element //....example: generateHappyMeals(nodeName); } }; document.querySelector('#card').addEventListener('mouseout', MouseTrack);
#card { background-color: gainsboro; padding: 36px; }
<div id='card'> <form> <input type='email' name='email' placeholder='email'/> </form> </div>
快樂黑客!
我仍然會使用 mouseleave 偵聽器,但僅當鼠標坐標在框外時才隱藏下拉列表。
<div class='dropdown' id="login">
<form>
<input type='email' name='email' placeholder='email'/>
</form>
</div>
<script>
const loginBox = document.getElementById('login');
loginBox.addEventListener("mouseleave", function(event){
const wrapperBounding = loginBox.getBoundingClientRect();
if (event.clientX >= loginBox.left && event.clientX <= loginBox.right &&
event.clientY >= loginBox.top && event.clientY <= loginBox.bottom) {
return
}
hideDropdown();
});
</script>
這將確保下拉菜單僅在鼠標實際移出時才會消失。 它還將防止您的下拉菜單因其他插件而關閉,請參閱如何防止鼠標離開插件圖標?
我發現在使用 mouseleave() 事件時,將 cursor 移動到自動填充彈出窗口時,事件屬性中的“toElement”為 null。 將 cursor 移動到您網站的其他任何位置時,情況不應如此。
因此,如果 mouseleave() 事件只應在將您的 cursor 移動到您網站上的其他位置時發生,並且它是否在“外部”到任何瀏覽器創建的元素(如自動填充或標簽欄)並不重要,那么這將起作用,就像我一樣:
mouseLeaveEvent(e) {
if (e.toElement === null) {
return
}
// Your code here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.