ITPub博客

首页 > IT职业 > IT职场 > [js高手之路] dom常用节点属性兼容性详解与应用

[js高手之路] dom常用节点属性兼容性详解与应用

IT职场 作者:tankII 时间:2021-09-09 09:05:41 0 删除 编辑

一、每个DOM节点都有一个nodeType属性,表示节点类型, NodeType一共有12种类型,我们可以通过遍历内置的Node构造函数获取

 1          window.onload = function(){
 2             var str = "";
 3             for( var key in Node ){
 4                 str += "";
 5                 str += "";
 6                 str += "";
 7             }
 8             str += "
" + key + " " + Node[key] + "
"; 9 document.body.innerHTML = str; 10 }

ELEMENT_NODE 1
ATTRIBUTE_NODE 2
TEXT_NODE 3
CDATA_SECTION_NODE 4
ENTITY_REFERENCE_NODE 5
ENTITY_NODE 6
PROCESSING_INSTRUCTION_NODE 7
COMMENT_NODE 8
DOCUMENT_NODE 9
DOCUMENT_TYPE_NODE 10
DOCUMENT_FRAGMENT_NODE 11
NOTATION_NODE 12
其中,最常用的是1(元素节点) 和 3( 文本节点 ).可以结合childNodes做一个简单的应用

1         window.onload = function(){
 2             var oUl = document.getElementById("box");
 3             var cNodeList = oUl.childNodes;
 4             for( var i = 0, len = cNodeList.length; i 
10         
  • 11111
  • 11
  • 22222
  • 12
  • 33333
  • 13

    上例,给li加背景颜色, childeNodes在chrome和FF下会区分元素节点和文本节点. 所以为了在chrome和FF下加上背景颜色,

    需要nodeType = 1判断为元素节点,才能加上背景颜色

    二、nodeName和nodeValue属性

    如果是元素, nodeName就是标签名称, nodeValue为null, 如果是文本节点,自然就是空

    1         window.onload = function(){
    2             var oUl = document.getElementById("box");
    3             var cNodeList = oUl.childNodes;
    4             for( var i = 0, len = cNodeList.length; i 

    三、每个节点都有一个childNodes属性,保存的是当前节点下面的所有子节点,其中保存着一个nodeList对象,nodeList是一种类数组结构,

    有两种方法可以获取需要的子元素

    数组索引
    item方法

    1 var oUl = document.getElementById("box");
    2 var cNodeList = oUl.childNodes;
    3 console.log( cNodeList[0] );
    4 console.log( cNodeList.item(0) );

    如果这个nodeList需要使用数组方法,他不能直接调用,需要转成数组方式

    console.log( cNodeList.slice( 0, 1 ) ); 这样使用,会报错. 应该先转成数组,可以采用以下两种方式:

    1  // var aNode = [].slice.call( cNodeList, 0 );
    2 var aNode = Array.prototype.slice.call( cNodeList, 0 );
    3 console.log( aNode );

    在IE8及其更老的版本,不支持这两种方式,只能使用for循环遍历

    1             try {
    2                 var aNode = [];
    3                 aNode = Array.prototype.slice.call( cNodeList, 0 );
    4             } catch( e ){
    5                 for( var i = 0, len = cNodeList.length; i 

    四、兄弟节点、第一个子节点、最后一个子节点、父节点(parentNode),子节点(children)

    这里一个有4组属性,IE和Chrome,FF支持的属性分别如下

    在IE下是支持firstChild,lastChild,nextSibling,previousSibling

    在Chrome和FF下支持: firstElementChild,lastElementChild,nextElementSibling,previousElementSibling

    如果需要兼容,我们可以采用短路表达式:

    1 window.onload = function(){
     2             var aDiv = document.getElementsByTagName( "div" );
     3             (aDiv[2].previousElementSibling || aDiv[2].previousSibling).style.color = 'red';
     4             (aDiv[1].nextElementSibling || aDiv[1].nextSibling).style.color = 'green';
     5             (document.body.firstElementChild || document.body.firstChild).style.color = 'blue';
     6             (document.body.lastElementChild || document.body.lastChild).style.color = 'orange';
     7 }
     8 
     9 
    ghostwu1
    10
    ghostwu2
    11
    ghostwu3
    12
    ghostwu4

    parentNode的小应用,隐藏当前a元素对应的li元素

    1         window.onload = function(){
     2             var aHref = document.getElementsByTagName("a");
     3             for( var i = 0, len = aHref.length; i 
    11        
  • 1111隐藏
  • 12
  • 2222隐藏
  • 13
  • 3333隐藏
  • 14

    children的小应用,隔行变色

    1         window.onload = function(){
     2             var oDiv = document.querySelector("#box");
     3             var aP = oDiv.children;
     4             aP = [].slice.call(aP);
     5             aP.forEach(function( el, key ) {
     6                 el.style.backgroundColor = ( key % 2 == 0 ? 'red' : 'green' );
     7             }, this);
     8         }
     9 
    10 
    11     
    12

    13

    14

    15

    16

    17

    18

    来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1795/viewspace-2808042/ ,如需转载,请注明出处,否则将追究法律责任。

    请登录后发表评论 登录
    全部评论

    注册时间:2022-07-18

    • 博文量
      0
    • 访问量
      5736