const inputs = document.querySelectorAll('.menu-item > input');
const items = document.querySelectorAll('.menu-item');
// Uncheck checkboxes when clicking on somewhere else.
document.documentElement.addEventListener('click', evt => {
if (evt.target.tagName === 'LABEL') {
return;
}
for (const el of inputs) {
if (el !== evt.target) {
el.checked = false;
}
}
});
// Hover over the top menu checks the input automatically.
items.forEach(el => {
el.addEventListener('mouseover', () => {
el.querySelector('input').checked = true;
});
el.addEventListener('mouseout', () => {
setTimeout(() => {
for (const hovered of document.querySelectorAll(':hover')) {
if (hovered === el) {
return;
}
}
el.querySelector('input').checked = false;
}, 1);
});
});
const inputs = document.querySelectorAll('.menu-item > input');:這行程式碼使用 document.querySelectorAll 選擇所有具有 .menu-item > input 選擇器的元素,也就是所有選單項目中的 input 元素。這些 input 元素是用於控制下拉菜單的顯示和隱藏。
const items = document.querySelectorAll('.menu-item');:這行程式碼使用 document.querySelectorAll 選擇所有具有 .menu-item 選擇器的元素,也就是所有選單項目。
document.documentElement.addEventListener('click', evt => { ... });:這是一個事件監聽器,它在整個文檔(document.documentElement)上監聽點擊事件。當點擊發生時,它執行回調函數。
evt.target.tagName === 'LABEL':這行程式碼檢查點擊事件的目標元素是否為 LABEL 標籤。如果是,則不執行後續的操作,這是因為點擊標籤通常是為了選擇相關的 input 元素,不應該觸發選單的關閉。for (const el of inputs) { ... }:這是一個循環,遍歷所有的 input 元素。
if (el !== evt.target):這行程式碼檢查每個 input 元素是否不是觸發點擊事件的目標元素。
el.checked = false;:如果 input 元素不是觸發點擊事件的目標元素,則將其 checked 屬性設置為 false,以關閉相關的下拉菜單。items.forEach(el => { ... });:這是一個遍歷所有選單項目的循環。
el.addEventListener('mouseover', () => { ... });:這是一個滑鼠懸停事件監聽器,當用戶將滑鼠懸停在選單項目上時觸發。當滑鼠懸停在選單項目上時,它執行回調函數。
el.querySelector('input').checked = true;:這行程式碼將相對應的 input 元素的 checked 屬性設置為 true,以打開下拉菜單。el.addEventListener('mouseout', () => { ... });:這是一個滑鼠移出事件監聽器,當用戶將滑鼠移出選單項目時觸發。當滑鼠移出選單項目時,它執行回調函數。
setTimeout(() => { ... }, 1);:這是一個定時器,它在滑鼠移出選單項目後約1毫秒後執行回調函數。
for (const hovered of document.querySelectorAll(':hover')) { ... }:這是一個遍歷當前頁面上所有懸停元素的循環。
if (hovered === el) { return; }:這行程式碼檢查如果某個懸停元素等於當前的選單項目,則退出循環,不執行後續的操作。el.querySelector('input').checked = false;:如果滑鼠已經移出選單項目且沒有懸停在其他元素上,則將相對應的 input 元素的 checked 屬性設置為 false,以關閉下拉菜單。
iThome鐵人賽