JavaScript獲取HTML文檔中的某個元素的右兄弟節(jié)點是非常常見的操作,我們可以使用JavaScript中的nextSibling屬性去獲取元素的兄弟節(jié)點,然后再通過nextSibling獲取它的右兄弟節(jié)點。
假設(shè)我們有如下的HTML文檔:
<div> <p>第一個p標簽</p> <p id="target">我們需要獲取的p標簽</p> <p>第三個p標簽</p> </div>
我們需要獲取id為“target”的p標簽的右兄弟節(jié)點。
// 通過getElementById獲取目標元素 var targetElem = document.getElementById("target"); // 通過nextSibling獲取右兄弟節(jié)點 var rightSibling = targetElem.nextSibling; // 打印右兄弟節(jié)點的文本內(nèi)容 console.log(rightSibling.textContent);
上面的代碼中,我們先通過getElementById方法獲取了id為“target”的p標簽元素,然后使用它的nextSibling屬性獲取了它的右兄弟節(jié)點,最后通過rightSibling.textContent打印出右兄弟節(jié)點的文本內(nèi)容。
但是這段代碼有個問題,它獲取到的右兄弟節(jié)點并不是我們期望的p標簽元素,而是該元素后面的文本節(jié)點。這是因為HTML文檔解析時會將元素間的空格、回車等特殊符號解析成文本節(jié)點。
我們可以通過循環(huán)獲取下一個兄弟節(jié)點,直到找到一個元素節(jié)點為止,這樣就能排除掉文本節(jié)點的影響。
// 通過getElementById獲取目標元素 var targetElem = document.getElementById("target"); // 定義一個變量用于存儲右兄弟節(jié)點 var rightSibling = targetElem.nextSibling; // 循環(huán)獲取下一個兄弟節(jié)點,直到找到元素節(jié)點為止 while (rightSibling.nodeType !== 1) { rightSibling = rightSibling.nextSibling; } // 打印右兄弟節(jié)點的文本內(nèi)容 console.log(rightSibling.textContent);
上面的代碼中,我們先通過getElementById方法獲取了id為“target”的p標簽元素,然后使用它的nextSibling屬性獲取了它的右兄弟節(jié)點。接下來,我們使用while循環(huán)獲取下一個兄弟節(jié)點,直到找到一個元素節(jié)點為止。最后,通過rightSibling.textContent打印出右兄弟節(jié)點的文本內(nèi)容。
如果我們將HTML文檔改成如下:
<div> <p>第一個p標簽</p> <span>一個span標簽</span> <p id="target">我們需要獲取的p標簽</p> <p>第三個p標簽</p> </div>
我們需要獲取id為“target”的p標簽的右兄弟節(jié)點。這時,上面的代碼失效了,因為我們的循環(huán)條件只判斷了元素節(jié)點(nodeType === 1)。
我們需要在循環(huán)中判斷當前節(jié)點類型是不是元素節(jié)點(nodeType === 1),如果不是則繼續(xù)獲取下一個兄弟節(jié)點,直到找到為止。
// 通過getElementById獲取目標元素 var targetElem = document.getElementById("target"); // 定義一個變量用于存儲右兄弟節(jié)點 var rightSibling = targetElem.nextSibling; // 循環(huán)獲取下一個兄弟節(jié)點,直到找到元素節(jié)點為止 while (rightSibling && rightSibling.nodeType !== 1) { rightSibling = rightSibling.nextSibling; } if (rightSibling) { // 打印右兄弟節(jié)點的文本內(nèi)容 console.log(rightSibling.textContent); } else { console.log("沒有找到右兄弟節(jié)點"); }
上面的代碼中,我們先通過getElementById方法獲取了id為“target”的p標簽元素,然后使用它的nextSibling屬性獲取了它的右兄弟節(jié)點。接下來,我們使用while循環(huán)獲取下一個兄弟節(jié)點,直到找到一個元素節(jié)點為止。注意,這里我們使用了"&&"符號,如果rightSibling為false,就不會再判斷rightSibling.nodeType !== 1,避免了代碼的拋出。最后,我們判斷找到的右兄弟節(jié)點是否存在,如果存在則通過rightSibling.textContent打印出右兄弟節(jié)點的文本內(nèi)容,否則打印“沒有找到右兄弟節(jié)點”。
使用上面的這種方式,可以有效避免因為文本節(jié)點以及其他節(jié)點類型的存在而導致的獲取錯誤。