JS DOM 对象

声明是DOM

  document Object Model(文档对象类型),DOM是针对html和XML文档的一个API。DOM描绘了一个层次化的节点树

允许开发人员添加、移除和修改页面的某一部分

HTML DOM定义了访问和操作HTML文档的标准方法,要改变页面某个东西,javascript 就需要获取对HTML文档中所有元素

进行访问的入口,这个入口连同对HTML元素进行添加,移动,改变和移除的方法和属性,都是通过文档对象模型来获得的(DOM)

我们可以通过javascript操作DOM 可以对节点实现增删改查操作,可以动态添加标签和属性等

 

声明是节点

  HTML文档中的每个成份都是一个节点。

  1.节点类型

    DOM是这样规定的:整个文档是一个文档节点,每个HTML标签是一个元素节点,包含在HTML元素中文本是一个文本节点,每一个HTML属性是一个属性节点,注释属于注释节点。

  2.节点层次关系:

  节点彼此都有等级关系。HTML文档中所有几点组成了文档树(或节点树),HTML文档中的每个元素、属性、文本等都代表着树中的一个节点,树起始于文档节点,并由此继续伸出枝条,直到处于这棵树最低级别的所有文本节点止。

  head和body 的父节点是html节点,文本节点"hello word“的父节点是p节点。

  head节点有一个子节点,title节点,title节点也有一个子节点;文本节点"DOM Tutorial"。

  当节点分享同一个父节点时,它们就是同辈(同级节点),比方说,h1和p是同辈,因为她们呢的父节点是body

  节点也可以拥有后代,后代指某个节点的所有子节点,或者这些节点的子节点

  节点也可以拥有先辈,先辈是某节点的父节点,或者父节点的父节点,以此类推,比方说,所有的文本节点都可把html节点作为先辈节点

  3.点属性

  每个节点都拥有包含关于节点某些信息的属性,这些属性是

 

      nodeName(节点名称)

      元素节点的nodeName 是标签名称

      文本节点的nodeName 永远是#text

      注释节点的nodeName 永远是#comment

    nodeValue(节点值)

      文本节点nodeValue 属性包含文本

      元素节点nodeValue 不可以用

      注释节点nodeValue 包括注释内容

    nodeYype(节点类型)

      元素------1

      属性------2

      文本------3

      注释-----8

      文档-----9

 

    <script>
    //输出BODY   标签的名称
    console.log(document.body.nodeName);
    //输出#text??? body标签中不是有个div标签吗  为什么它的第一自己点的名字是文本呢?  因为有换行,换行也属于文本节点
    console.log(document.body.firstChild.nodeName);
    
    
        
    </script>

nodeName  如果是标签,nodName就是标签名

nodeValue  如果是注释nodeValue就是注释的内容

nodeType  可以用来判断当前是不是文档节点

 

 

 

获取DOM元素:

  document.getElmentById()  根据ID名获取DOM元素  唯一一个 id不能重复

  document.getElementsByTagName()  根据标签名获取所有的DOM元素  返回HTMLCollection标签类型,类数组,不能使用数组的方法

  document.getElementsByClassName()  根据class获取元素列表  也返回HTMLCollection

  document.getElementsByName()  针对表单form对应获取相应的元素,返回NodeList节点列表,可以使用foreach

<body>
    <form action="#" method="GET">
        <input type="radio" name="ab" value="1">
        <input type="radio" name="ab" value="2">
        <input type="radio" name="ab" value="3">
        <input type="radio" name="ab" value="4">
        <input type="radio" name="ab" value="5">
        <input type="submit" value="提交">
    </form>


    <script>
        //循环遍历nodelist
        sname=document.getElementsByName('ab');
        for(i=0;i<sname.length;i++){
            console.log(sname[i]); 
        }
        //使用foreach 循环遍历
        sname.forEach(function (t){
            console.log(t);
            
        });



    </script>

  

document.querySelector()  根据选择器选择元素 css选择器

选择id=a  class=abc 的一个元素

var lis=document.querySelectorAll("#a .abc");

 

document.querySelectorAll()  

选择id=a  下面class=abc的所有元素,返回一个NodeList   需要遍历

var lis=document.querySelectorAll("#a .abc");
        var a=document.querySelectorAll("#css .abc");
        a.forEach(function (e){console.log(e);
        });
        

 

节点遍历

  childNodes:获取所有子节点  (包含注释)

  

    <div class="contnt">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
        <!-- 会显示我吗 -->
    </div>


    <script>

        var a=document.getElementsByTagName('div')[0].childNodes;
        
        console.log(a);   //返回  text  ul  text  comment注释
        
    </script>

 

  children:所有事标签类型的子节点  获取所有子元素

    <div class="contnt">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
        <!-- 会显示我吗 -->
    </div>
    <script>
        var a=document.getElementsByTagName('div')[0].children; 
        console.log(a);   //返回  HtMLCollection ul 只返回标签   
    </script>

 

  parentNode:获取已知节点的父节点

   <div class="contnt">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
        <!-- 会显示我吗 -->
    </div>
    <script>
        var a=document.getElementsByTagName('div')[0].parentNode; 
        console.log(a);   //返回  body标签节点    
    </script>

 

  firstElemntChild:第一个子节点(元素)

    <div class="contnt">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
        <!-- 会显示我吗 -->
    </div>
    <script>
        var a=document.getElementsByTagName('div')[0].firstElementChild; 
        console.log(a);   //获取第一子元素   返回ul标签
    </script>

 

  firstChild:第一个子节点

    <div class="contnt">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
        <!-- 会显示我吗 -->
    </div>
    <script>
        var a=document.getElementsByTagName('div')[0].firstChild; 
        console.log(a);   //获取第一子节点  返回#text(文本或换行)
    </script>

  lastElementChild:最后一个子节点(元素)

 

  lastChild:最后一个子节点

  nextElementSibling:下一个兄弟节点(元素)

  nextSibling:下一个兄弟节点

  previousElementSibling:前一个兄弟节点(元素)

  previousSibling:前一个兄弟节点

  

 <div class="contnt">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    <script>

        var div=document.getElementsByTagName("div")[0];
       for(i=0;i<div.firstElementChild.children.length;i++){
        div.firstElementChild.children[i].innerHTML=i+1;
       }

    </script>

 

创建元素

 

  document.createElment("标签名"):创建新元素

  document.body.appendChild("div"); 将创建的div元素 插入到body的尾部

  document.createTextNode("");:创建文本节点

  父元素.prepend('ul');将创建的ul,插入到父元素的最前面

  也可以使用insertBefore("newnode,oldnode"); 将newnode添加在oldnode前面

   案例 如,写一个button 按钮  不写值

  <button></button>
    <script>
    //获取button 标签
    var btn=document.querySelector("button");

    //创建文本节点
     var text=document.createTextNode("按钮");

     //把文本节点插入到按钮标签中
     btn.appendChild(text);

    </script>

 

document.createDocumentFragment(); 创建一个包裹  之后document.body.appendChild(包裹)  这样做提高性能

 注意:

  如果我们创建一个div,想在里面添加文本 有两种方法,如果想追加文本呢 那需要在创建一个文本节点,appendChild()追加下去

  如果不需要  可以使用div.textContent("内容")即可以

 

 删除复制替换

 删除元素 分为两种

  删除自己  remove()

  删除子元素  removeChild()

  ul.remove();将自己及下面的子元素都删除

   ul.removeChild(元素);  删除自己以外的子元素 参数元素

   

    <script>
      //删除ul 下所有子元素
      var ul=document.querySelector('ul');
     for(i=0;i<ul.children.length;i++){
        ul.lastElementChild.remove();
       
     }

    </script>

 

 

复制

  1.复制所有当前元素及当前元素的子元素  DOM元素深复制   cloneNode(true)

  2.仅复制当前元素及元素的属性,DOM元素浅复制  cloneNode(flase)

  

<button>按钮</button>
  <div id="a">
    <ul>
      <li></li>
      <li></li>
      <li></li>
    </ul>
  </div>
    <script>
      //无论是深复制还是浅复制元素  都有个缺点,id属性也会复制  后期需要累加更改
      var div=document.querySelector('#a');
      div.appendChild(div.cloneNode(true));

    </script>

替换

  父元素.repaliceChild(newNode,oldNode);  

 

<button>按钮</button>
  <div id="a">
    <ul>
      <li></li>
      <li></li>
      <li></li>
    </ul>
  </div>
    <script>
     //替换ul中第一个li节点元素
      var btn=document.querySelector("ul");
      var li=btn.firstElementChild;
       var p=document.createElement("p");
       p.textContent="我把这家伙替换了";

       //替换
      btn.replaceChild(p,li);
       

    </script>

 DOM常用属性

   document.body:body元素

  document.title:获取设置文档的标题

  document.URL:获取完整的URL

  document.domain:获取域名

 

获取节点上的属性

  getAttrlbute():获取节点上的属性

  setAttribute():属性,值)给节点创建一个新属性 

   removeAttribute(name):删除一个几点上的属性

DOM元素有两个属性

  一、标签属性

    <div title="" id="" class="" min-date=""></div> 其中title id class  这些系统自带的的属性  min-date 是自定义的属性 命名不区分大小写,单词与单词之间用横杠连接。

    标签属性不可以通过DOM对象方式获取自定义属性。

    自定义标签属性通过属性获取器,来获取

    console.log(document.querySelector("[my-name]"));

  二、对象属性

  ·  通过获取DOM的对象 增加一个属性  如:var div=document.getElementByTagName("div")[0]; div.a="中国",这个a就是对象的属性

    部分系统的标签属性和对象属性完全相同  id name type checked   title src.....

    注意  class属性在对象属性中是className 

 

    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>


    <script>
        var btn=document.getElementsByTagName("button");

        for(i=0;i<btn.length;i++){
            btn[i].addEventListener("click",clickHandler);
            //设置对象属性来存储i的值
            btn[i].n=i;
        }

        function clickHandler(e){
            //这里的this  就是被点击的btn  因为是btn调用的
            this.textContent=this.textContent+this.n;
        }

    </script>

 

 //获取 属性

    <div data-min="abc"></div>


    <script>

        var data=document.querySelector("div");
        console.log(data.getAttribute('data-min'));
    </script>

 

设置属性

 

        var data=document.querySelector("div");
        console.log(data.getAttribute('data-min'));   //abc
        data.setAttribute("data-min","123");
        console.log(data.getAttribute('data-min'));   //123

移除属性

 

        data.removeAttribute("data-min");
        console.log(data.getAttribute('data-min'));   //null

 

 

 

 

 

 

 

  

 

posted @ 2020-07-07 15:59  WhiteSpace  阅读(253)  评论(0编辑  收藏  举报