javascript 中的nextSibling和previousSibling使用注意事項


JavaScript中的nextSiblingpreviousSibling和作用類似於jquery的next()和prev(),都是獲取下一個/上一個同胞元素,如果下一個同級節點不存在,則此屬性返回值是null。但是具體的使用中還是有差異的,如果注意。就會引起錯誤

html結構中的各種空格,換行符都可能會把文本節點當做同胞元素處理。這就會導致錯誤。

例如下面代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script> window.onload = function() { var nextType = document.getElementById('one').nextSibling; alert(nextType.nodeType); } </script>
</head>
<body>
    <div id="div">
        <p id = "one">我是p</p>
        <span id="two">我是span</span>
    </div>
</body>
</html>

在上面這段代碼中,我獲取了id為"one"的元素並用nextSibling獲取了他的下一個同胞元素。賦值給了變量nextType

   var nextType = document.getElementById('one').nextSibling;

  並使用

  alert(nextType.nodeType);

彈出他的節點類型,如果按常理,元素p下一個相鄰的同胞元素為是span,彈出的數字應該為“1”,但我再火狐,谷歌,IE瀏覽器(網上說只有火狐才會把換行,空格當做文本節點處理,但是我測試谷歌,IE瀏覽器效果都是一樣的,這有點不解)打開后,彈出的數字是3,

 

也就是文本節點。這是因為換行符被當做文本節點來處理,成為了p元素的下一個同胞元素。

 

如果我要獲取我是span的文本值,需要這樣寫

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    window.onload = function() {
        var nextType = document.getElementById('one').nextSibling;
        var span = nextType.nextSibling;
     alert(span.lastChild.nodeValue);
   }
    </script>
</head>
<body>
    <div id="div">
        <p id = "one">我是p</p>
        <span id="two">我是span</span>
    </div>
</body>
</html>

p和span標簽中間隔着文本節點,需要連續使用2次nextSibling才能選中span標簽取得文本值

firstChild,lastChild,nextSibling,previousSibling都會將空格或者換行當做節點處理,但是有代替屬性

所以為了准確地找到相應的元素,會用

firstElementChild,

lastElementChild,

nextElementSibling,

previousElementSibling

兼容的寫法,這是JavaScript自帶的屬性。

但壞消息是IE6,7,8不兼容這些屬性。IE9以上和火狐谷歌支持。

 

於是我寫了一個接口口,測試能在包括ie6在內運行的函數(自己寫的,不知有沒有其他什么細節錯誤沒注意,反正能運行並且過濾文本節點獲取正確的下一個元素節點)

 

    function getNextElement(element){
            var e = element.nextSibling;
            if(e == null){//測試同胞節點是否存在,否則返回空
                return null;
            }
            if(e.nodeType==3){//如果同胞元素為文本節點
                var two = getNextElement(e);
                if(two.nodeType == 1)
                    return two;
            }else{
                if(e.nodeType == 1){//確認節點為元素節點才返回
                    return e;
                }else{
                    return false;
                }
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM