今天闲来无事,突然想到一些有趣的问题,具体问题如下:
1.在判断一个节点是否拥有子节点的时候,我常常使用node.hasChildNodes方法
if(node.hasChildNodes()){JavaScript code goes here......}
后来想到使用node.childNodes.length来判断。
if(node.childNodes.length!=0){JavaScript code goes here......}上面的两段代码作用应该一样吧。但是不知道两种用法有什么区别吗?
或者说在性能、执行效率上有所区别?使用哪一种更好一些?2.在判断一个节点是否拥有特定属性的时候,我常常使用
if(node.getAttribute("name")){JavaScript code goes here......}
或者if(node.getAttribute("name")!=null){JavaScript code goes here......}现在又想到几种方法:
if(node.attributes("name")!=null){JavaScript code goes here......}
if(node.hasAttribute("name")){JavaScript code goes here......}
if(node.attributes().getNamedItem("name").value){JavaScript code goes here......}这些代码的用法不知道又有什么区别?就像上面一样,使用哪一个都一样吗?3.在判断一个节点是否拥有属性的时候,是使用hasAttributes判断好还是使用attributes.length判断好?这几个问题基本上是一类的问题,希望高人指点一下!!!
万分感谢!!!

解决方案 »

  1.   

    node.hasAttribute("attName");//,not work in IE6,IE7
      

  2.   

    <div style="width:200px;height:200px;background-color:red;" onclick="if(this.hasChildNodes()){alert('Yes');} else alert('No');">
    </div>
    <div style="width:200px;height:200px;background-color:green;" onclick="if(this.childNodes.length!=0){alert('Yes');} else alert('No');">
    </div>1.在判断一个节点是否拥有子节点的时候,我常常使用node.hasChildNodes方法JScript code    if(node.hasChildNodes()){JavaScript code goes here......}
    后来想到使用node.childNodes.length来判断。JScript code    if(node.childNodes.length!=0){JavaScript code goes here......}上面的两段代码作用应该一样吧。但是不知道两种用法有什么区别吗?
    或者说在性能、执行效率上有所区别?使用哪一种更好一些?在FF和IE下皆不同
      

  3.   

    先抛开浏览器差异不说,从代码的易读性和可维护性来说,if(node.hasChildNodes()){JavaScript code goes here......}
    if(node.hasAttribute("name")){JavaScript code goes here......}
    是最可取的!因为这种写法很干净、易于理解!《Clean Code》 中特别说明了,建议将判断语句封装为方法!
      

  4.   

    明显用
    if(node.hasChildNodes()){JavaScript code goes here......} 
    if(node.hasAttribute("name")){JavaScript code goes here......}
    因为
    node.hasChildNodes()不存在是
    if(node.childNodes.length!=0){JavaScript code goes here......}会出错,因为node.childNodes为undefined.
    同样的道理,不用
    if(node.attributes().getNamedItem("name").value){JavaScript code goes here......}
      

  5.   

    判断是否有子节点2个方法都可以,但是要注意的是FF下的空白节点。2个div间空了一行,在FF下会视为有一个空白的文本节点,不知道是不是bug。判断属性,我认为最正确的是用属性的写法,不用节点操作。我以前也经常用node.setAttribute("name","aaa")这种写法,但是这种写法只是标准的操作XML的写法,不是标准的操作html的方法,如果用
    node.name==null来判断属性就最正确了,而且还简略些,呵呵。
      

  6.   

    在FF下会视为有一个空白的文本节点,不知道是不是bug。 
    re:
    不是firefox的bug!是微软太爱你了!因为whitespace也是节点!在所有的api中都有这种情况