JavaScript >> Javascript 文檔 >  >> JavaScript

如何使用 JavaScript 獲取元素的所有兄弟姐妹

在上一篇文章中,我們研究瞭如何在 JavaScript 中獲取元素的下一個和上一個兄弟元素。

如果你想選擇全部怎麼辦 一個元素的兄弟姐妹?

假設您有以下 HTML 列表:

<ul>
    <li>🍔</li>
    <li>🍕</li>
    <li id="drink">🍹</li>
    <li>🍲</li>
    <li>🍩</li>
</ul>

我們想得到 #drink 元素,然後定位它的所有兄弟元素。

以下幫助函數將元素作為輸入並返回其所有兄弟元素:

const siblings = (elem) => {
    // create an empty array
    let siblings = [];

    // if no parent, return empty list
    if (!elem.parentNode) {
        return siblings;
    }

    // first child of the parent node
    let sibling = elem.parentNode.firstElementChild;

    // loop through next siblings until `null`
    do {
        // push sibling to array
        if (sibling != elem) {
            siblings.push(sibling);
        }
    } while (sibling = sibling.nextElementSibling);
		
    return siblings;
};

const drink = document.querySelector('#drink');

// get all all siblings
const nodes = siblings(drink);

nodes.forEach(li => console.log(li.innerText));

// 🍔
// 🍕
// 🍲
// 🍩

以下是它的工作原理:

  1. 獲取我們要查找的兄弟元素的父元素。
  2. 在該父元素中查找第一個子元素。
  3. 將第一個元素子元素添加到兄弟元素數組中。
  4. 選擇第一個元素的下一個同級元素。
  5. 最後,重複第 3 步和第 4 步,直到沒有兄弟姐妹。如果兄弟元素是原始元素,請跳過第 3 步。

過濾兄弟姐妹

有時,您可能想要過濾掉元素的兄弟姐妹。例如,您可能希望獲取作為錨鏈接的節點的所有兄弟節點(<a> )。

為此,您可以將可選的文件管理器函數傳遞給輔助函數,如下所示:

const siblings = (elem, filter) => {
    // create an empty array
    let siblings = [];

    // if no parent, return empty list
    if (!elem.parentNode) {
        return siblings;
    }

    // first child of the parent node
    let sibling = elem.parentNode.firstElementChild;

    // loop through next siblings until `null`
    do {
        // push sibling to array
        if (sibling != elem && (!filter || filter(sibling))) {
            siblings.push(sibling);
        }
    } while (sibling = sibling.nextElementSibling);

    return siblings;
};

以下示例演示瞭如何使用 siblings() 輔助函數來獲取錨元素的所有兄弟元素,它們也是錨節點:

const anchor = document.querySelector('a.current');

// get all anchor links
const links = siblings(anchor, (e) => {
    return e.nodeName.toLowerCase() === 'a';
});

links.forEach(a => console.log(a.href));

空格和註釋

上面的輔助函數依賴於 nextElementSibling 通過忽略空格和註釋返回下一個元素節點的屬性。

如果您想獲取所有兄弟姐妹,包括空格和註釋,請使用 nextSibling 而是財產。它返回下一個兄弟節點,可能是文本節點(空格)或註釋節點。

瀏覽器兼容性

上面的輔助函數應該可以在所有現代瀏覽器和 IE9 及更高版本中運行。


Tutorial JavaScript 教程
  1. 作為開發人員你應該知道的 9 個數據結構和算法

  2. Set,一個標準的內置 Javascript 對象

  3. 了解 Nodejs 中的 MVC 模式

  4. 1/7 使用 React 和 XState 的 GUI 任務:計數器

  5. Angular 在 2022 年仍然有用嗎?

  6. 重新開始:沒關係

  7. 使用 Cookie (JavaScript) 存儲登錄信息

  1. 全棧 Instagram:簡介

  2. 編寫 Scrum 工具包 #3 - 使用 Node、TypeScript、Websocket 和 TypeORM 的服務器

  3. 使用 Vanilla Javascript 延遲加載圖像

  4. 使用 elem.scrollIntoView 定義元素應滾動到的位置

  5. 使用 MERN Stack 免費源代碼構建 Instagram 克隆

  6. 使用 Auth0、Cloudinary 和 React 構建用戶庫

  7. JavaScript 中的合併排序 |徹底解釋

  1. 😷 如何創建冠狀病毒 (COVID-19) API 和 Web 小部件。

  2. 使用 Node.JS 啟動 REST API

  3. 讓我們使用 REACT JS 創建一個添加標籤輸入

  4. 使用分支和合併