獲取頁面中所有 checkbox 的方法有很多種,以下列出幾種常見且實用的方法,並解釋其優缺點:
1. 使用 querySelectorAll
(推薦)
const checkboxes = document.querySelectorAll('input[type="checkbox"]');
// 將 NodeList 轉換為陣列,以便使用陣列方法
const checkboxArray = Array.from(checkboxes);
checkboxArray.forEach(checkbox => {
// 對每個 checkbox 進行操作,例如:
console.log(checkbox.checked); // 獲取 checkbox 的選中狀態
});
- 優點: 簡潔、高效、現代瀏覽器都支援。
querySelectorAll
返回的是一個靜態的 NodeList,這意味著即使 DOM 更新,NodeList 也不會改變,避免了一些潛在的效能問題。 - 缺點: IE8 以下不支援。
2. 使用 getElementsByTagName
const inputs = document.getElementsByTagName('input');
const checkboxes = [];
for (let i = 0; i < inputs.length; i++) {
if (inputs[i].type === 'checkbox') {
checkboxes.push(inputs[i]);
}
}
checkboxes.forEach(checkbox => {
// 對每個 checkbox 進行操作
});
- 優點: 相容性好,即使是舊版瀏覽器也支援。
- 缺點: 效率略低於
querySelectorAll
,需要遍歷所有 input 元素。返回的是一個動態的 HTMLCollection,這意味著如果 DOM 更新,HTMLCollection 也會隨之改變,需要注意潛在的效能問題和無限迴圈的風險。
3. 使用特定框架/庫 (例如 jQuery)
如果你的專案使用了類似 jQuery 的庫,可以使用其提供的選擇器方法:
// jQuery
const checkboxes = $('input[type="checkbox"]');
checkboxes.each(function() {
// 對每個 checkbox 進行操作,例如:
console.log($(this).is(':checked')); // 獲取 checkbox 的選中狀態
});
- 優點: 如果已經使用了框架/庫,則程式碼更簡潔。
- 缺點: 依賴於特定的框架/庫。
4. 遞迴查詢 (適用於複雜場景)
如果 checkbox 巢狀在複雜的元件或 shadow DOM 中,可以使用遞迴查詢:
function getAllCheckboxes(element) {
const checkboxes = [];
const elements = element.querySelectorAll('*'); // 獲取所有後代元素
for (let i = 0; i < elements.length; i++) {
if (elements[i].type === 'checkbox') {
checkboxes.push(elements[i]);
}
// 遞迴查詢子元素
checkboxes.push(...getAllCheckboxes(elements[i]));
}
return checkboxes;
}
const allCheckboxes = getAllCheckboxes(document.body); // 從 body 開始查詢
- 優點: 可以處理複雜的巢狀結構,包括 shadow DOM。
- 缺點: 實現較為複雜,效能消耗可能較大,需要謹慎使用。
選擇哪種方法取決於你的具體需求和專案環境。對於大多數情況,querySelectorAll
是首選方案,因為它簡潔、高效且相容性良好。 如果需要相容非常老的瀏覽器,可以考慮使用 getElementsByTagName
。 如果專案已經使用了框架/庫,則可以使用框架/庫提供的方法。 對於複雜的巢狀結構,可以考慮使用遞迴查詢。