首页 > 技术文章 > nextSibling VS nextElementSibling

jackydalong 2013-10-07 10:29 原文

2.    nextSibling vs nextElementSibling
            {
                //FF
                {
                    在Firefox中,link2的nextSibling并不是link3,因为两者之间有一个换行符.
                    这被认为是一个空格, 所以link2的nextSibling就是这个空格,即一个text node,IE不存在这个问题。
                    <a href="link2" id="link2"></a>
                    <a href="link3" id="link3"></a>
                }
                
                //IE
                {
                    IE不存在这个问题。
                }
                
                //solution
                {
                    //cause
                    {
                        DOM标准明确说了nextSibling返回当前元素的下一个Node,而<a>元素后的Node明显是一个TextNode,
                        其nodeValue是'\n',而IE竟然没有返回一个TextNode,跳过了一个Node
                    }
                    
                    //不支持version
                    {
                        FireFox(版本号:3.5.11)中不支持JavaScript的previousSibling属性。

                        IE(版本号:8.0.6001.18702)中不支持JavaScript的previousElementSibling属性。

                        用jQuery可以达到跨浏览器的支持。
                    }
                    
                    //solution
                    {
                        /最新的浏览器确实已经已经支持如下的DOM标准
                        {
                            Feature     Chrome     Firefox (Gecko)     Internet Explorer                 Opera     Safari
                            Basic support     1     3.5                 9 (IE6-8 incl commend nodes)     10         4
                            
                            //childElementCount
                            {
                                属性返回当前元素的子元素个数,而不是子节点个数.
                                只有当一个节点的nodeType属性为1(Node.ELEMENT_NODE==1)时,它才是元素节点.
                                文本节点和注释节点不属于元素节点.
                                
                                //注意
                                {
                                    另外,由于IE9之前的版本不支持childElementCount属性, 所以如果考虑兼容性的话,
                                    请使用element.children.length(并且需要判断nodeType是否为1)
                                    来代替childElementCount属性.
                                }
                            }
                            
                            //children    vs childNodes
                            {
                                children:获取一个元素的【子元素节点】集合
                                childNodes:获取一个元素的【子节点】集合
                                (/注意:IE10支持nextSibling.children|childNodes/)
                                (/        FF23支持netxElementSibling.children|childNodes/)
                                
                                //注意
                                {
                                    在IE9之前,element.children会包含一个元素的子元素节点和子注释节点.
                                    在IE9之后或者其他浏览器中, 只包含子元素节点.
                                }
                            }
                            
                            //一般人使用nextSibling是不会期望去得到一个换行符的,
                            //所以新版的DOM标准提供了nextElementSibling来跳过这些【空白符和文本节点】
                            {
                                nextElementSibling        
                                firstElementChild
                                lastElementChild
                                childElementCount
                                children
                                previousElementSibling
                            }
                        }
                        
                        //example
                        {
                            var cusName = e.parentNode.previousElementSibling.children[1].value;
                        }
                        
                    }
                }
            }
        }

参考链接
http://ricoyu.iteye.com/blog/940760
https://developer.mozilla.org/zh-CN/docs/DOM/element.childElementCount

 

推荐阅读