DOM

  1. 什么是DOM:
  2. DOM树:
  3. 查找元素

一. 什么是DOM: Document Object Model(文档 对象 模型)

  1. 什么是: 专门操作网页内容的一套对象和函数的集合。
  2. 何时: 今后只要想操作网页内容,都必须用DOM


    dom1.png
  1. DOM标准: W3C负责制定并维护的一套国际标准。几乎所有浏览器100%兼容。
    4. 包括: 5件事: 增删改查+事件绑定

二. DOM树:

  1. 什么是: 专门在内存中保存一个网页的所有内容的树形结构。
  2. 为什么: 因为网页中的元素都是上下级包含关系,而树形结构是最适合保存上下架包含关系的结构。最直观。
  3. 如何:


    dom2.png

三. 查找元素: 4种:

强调: 所有元素对象,必须找到才能使用!没有任何一个节点/元素可以直接使用!

  1. 不需要查找就可快速获得的元素: 4种:
    (1). 树根节点对象: document对象
    (2). <html>: document.documentElement
    (3). <head>: document.head
    (4). <body>: document.body
    总结: DOM 4步:
    1. 先查找触发事件的元素
    2. 再为元素绑定事件处理函数
    3. 查找要修改的元素
    4. 修改元素

总结: DOM 5件事: 增删改查+事件绑定:
//不要背!用到时,来查找,复制粘贴就行了!
1. 查找元素: 4种
(1). 不需要查找就可直接获得的元素对象: 4种:
document 根节点 document
document.documentElement —— <html>
document.head —— <head>
document.body —— <body>
1. 查找 2. 修改

一. 查找:

1. 按节点间关系查找:

(1). 何时: 如果我们已经提前获得了一个元素,想找它周围附近的关系比较紧密的元素时,都用按节点间关系查找。
(2). 节点树:
a. 什么是: 包含所有网页内容的完整树结构。
b. 2大类关系: 6个属性:
**1). 父子关系: 4个属性: **
i. 获得一个元素的父元素: 元素对象.parentNode父 节点对象
ii. 获得一个元素下的所有直接子元素: 元素对象.childNodes子 节点对象们
iii. 获得一个元素下的第一个直接子元素: 元素对象.firstChild
第一个孩子
iv. 获得一个元素下的最后一个直接子元素: 元素对象.lastChild
最后一个孩子
2). 兄弟关系: 2个属性
i. 获得当前元素的前一个兄弟元素: 元素对象.previousSibling
前一个 兄弟
ii. 获得当前元素的后一个兄弟元素: 元素对象.nextSibling
后一个兄弟
c. 问题: 节点树会把看不见的空字符(空格、换行、Tab)也看成是DOM树上的节点对象。但是,开发时我们从不关心看不见的空节点对象,只关心可以看见的元素节点对象。所以,节点树最大的缺点是干扰我们的查找!所以,将来节点树几乎不用!
**(3). 元素树: **
a. 什么是: 只包含元素节点对象的树结构。
b. 好处: 没有多余的对象干扰查找结构。
c. 2大类关系: 6个属性
1). 父子关系: 4个属性
i. 获得一个元素的父元素: 元素对象.parentElement
父 元素
ii. 获得一个元素的所有直接子元素: 元素对象.children
孩子们
返回: 类数组对象,其中包含这个元素的所有直接子元素对象
iii. 获得一个元素下第一个直接子元素:
元素对象.firstElementChild
第一个 元素 孩子
iv. 获得一个元素下最后一个直接子元素
元素对象.lastElementChild
最后一个元素 孩子
2). 兄弟关系: 2个属性:
i. 获得当前元素的前一个兄弟元素: 元素对象.previousElementSibling 前一个 元素 兄弟
ii. 获得当前元素的后一个兄弟元素: 元素对象.nextElementSibling
后一个元素 兄弟

dom3.png

(4). 示例: 使用元素树关系,查找想要的元素
1_domTree.html

<!DOCTYPE HTML>
<html>
  <head>
    <title>DOM Tree</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <span id="s1">Hello</span>
    <h1>标题一</h1>
    <script>
      //输出DOM树结构
      console.log(document);
      console.log(document.documentElement);
      console.log(document.head);
      console.log(document.body);
      //输出一个对象自己身上的属性结构: 
      console.dir(document);
      console.dir(document.documentElement);
      console.dir(document.head);
      console.dir(document.body);
      //想获得body下所有直接子元素:
      //错误:
      // var childNodes=document.body.childNodes;
      // console.log(childNodes);
      //正确: 
      var children=document.body.children;
      console.log(children);
      //获得body下第一个直接子元素: span
      //错误: 
      // var span=document.body.firstChild;
      //正确: 
      var span=document.body.firstElementChild;
      console.log(span);
      //想获得h1
      //错误: 
      // var h1=span.nextSibling;
      //正确: 
      var h1=span.nextElementSibling;
            //children[1]
      console.log(h1);
    </script>
  </body>
</html>

运行结果:
[图片上传失败...(image-6a66ab-1627540705608)]

2. 按HTML特征查找:
(1). 问题: 如果要找的元素距离当前的元素比较远,或藏的层级很深,如果用节点间关系查找,步骤很繁琐
(2). 解决: 今后,还可以按元素身上的HTML特征来查找任意位置的元素.
(3). 包括: 4个函数
a. 按id名查找一个元素对象:
1). var 一个元素对象=document.getElementById("id名");
在整个网页中查找元素
按id名
2). 返回值:
i. 如果找到指定id名的元素,则返回这个元素的对象
ii. 如果没找到指定id名的元素,则返回null
3). 强调:
i. .前必须是document
ii. 因为注定只能返回一个元素,所以,方法名中的Element是单数,没有s结尾。
4). 问题: 一次注定只能查找一个元素
b. 按标签名查找多个元素:
1). var 类数组对象=任意父元素.getElementsByTagName("标签名")
在任意父元素下查找元素们
按标签名
2). 返回值:
i. 如果找到指定标签名称的元素,就会放在一个类数组对象中返回。
ii. 如果没找到指定标签名称的元素,就返回空类数组对象:
{ length:0 } 不同于null
3). 强调:
i. .前可以写任意一个父元素,表示只在这个父元素内查找符合要求的元素。选择合适的父元素缩小查找范围,有助于提高查找速度!当然,如果确实需要在整个网页范围查找元素,.前也可以写document。
ii. 因为按标签名查找完全有可能找到多个元素,所以,函数名中Elements是复数形式,s结尾,表示多个。
iii. 不但在直接子元素中查找,而且还会在所有后代中查找符合要求的元素。
iv. 如果只找到一个符合要求的元素,也会返回一个类数组对象,然后,把唯一找到的元素,放在类数组对象中第一个[0]位置的元素。又因为,我们最终要操作的是元素对象,不是类数组对象,所以,如果想获得找到的唯一的一个元素对象,必须手工加[0]才能取出0位置的一个元素对象来继续操作。

dom4.png

c. 按class名查找多个元素:
1). var 类数组对象=任意父元素.getElementsByClassName("class名")
在任意父元素下获取多个元素
按class名
2). 返回值:
i. 如果找到指定class名的元素,就会放在一个类数组对象中返回。
ii. 如果没找到指定class名的元素,就返回空类数组对象:
{ length:0 } 不同于null
3). 强调:
i. .前可以写任意一个父元素,表示只在这个父元素内查找符合要求的元素。选择合适的父元素缩小查找范围,有助于提高查找速度!当然,如果确实需要在整个网页范围查找元素,.前也可以写document。
ii. 因为按class名查找完全有可能找到多个元素,所以,函数名中Elements是复数形式,s结尾,表示多个。
iii. 不但在直接子元素中查找,而且还会在所有后代中查找符合要求的元素。
iv. 如果只找到一个符合要求的元素,也会返回一个类数组对象,必须手工加[0]才能取出0位置的一个元素对象来继续操作。
v. 如果一个元素同时被多个class修饰,则只需要其中任意一个class,就可找到这个元素。
d. 按name名查找多个元素:
1). 何时: 今后如果查找带有name名的表单元素,都用按name名查找
2). 如何:
var 类数组对象=document.getElementsByName("name名")
在整个页面中查找多个元素
按Name名
3). 返回值:
i. 如果找到指定name名的元素,就会放在一个类数组对象中返回。
ii. 如果没找到指定name名的元素,就返回空类数组对象:
{ length:0 } 不同于null
4). 强调:
i. .前必须写document。
ii. 因为按name名查找完全有可能找到多个元素,所以,函数名中Elements是复数形式,s结尾,表示多个。
iii. 如果只找到一个符合要求的元素,也会返回一个类数组对象,必须手工加[0]才能取出0位置的一个元素对象来继续操作。
(4). 示例: 使用按HTML特征查找获取想要的元素

2_iterator.html
<!DOCTYPE HTML>

<html>

  <head>

    <title>遍历节点树</title>

    <meta charset="utf-8"/>

  </head>

  <body>

    <span>Hello World !</span>

    <ul id="nav">

      <li class="item parent">电影</li>

      <li class="item parent">综艺

        <ul>

          <li class="item child active">跑男</li>

          <li class="item child">爸爸</li>

          <li class="item child">极限</li>

        </ul>

      </li>

      <li class="item parent">剧集</li>

    </ul> 

    <form>

      用户名:<input name="uname"><br/>

      性别:<label><input type="radio" name="sex" value="1">男</label>

      <label><input type="radio" name="sex" value="0">女</label>

    </form>

    <script>

      //查找id为nav的ul

      var ulNav=document.getElementById("nav");

      console.log(ulNav);

      //查找id为navy的元素(不存在)

      var navy=document.getElementById("navy");

      console.log(navy);

      //查找ulNav元素下所有li元素

      var lis=ulNav.getElementsByTagName("li");

      console.log(lis);

      //查找ulNav下唯一内嵌的一个ul

      //错误: 得不到ul元素对象,只能得到一个大的类数组对象

      // var ul=ulNav.getElementsByTagName("ul");

      var ul=ulNav.getElementsByTagName("ul")[0];

      console.log(ul);

      //查找ulNav下的td元素(不存在)

      var tds=ulNav.getElementsByTagName("td");

      console.log(tds);

      //查找ulNav下所有class为child的元素

      var children=ulNav.getElementsByClassName("child");

      console.log(children);

      //只查找ulNav下一个class为active的元素

      //错误: 

      // var active=ulNav.getElementsByClassName("active")

      var active=

        ulNav.getElementsByClassName("active")[0];

      console.log(active);

      //查找name名为sex的所有表单元素

      var radios=document.getElementsByName('sex');

      console.log(radios);

      //查找name名为uname的一个文本框对象

      //错误: 

      // var txt=document.getElementsByName("uname");

      var txt=document.getElementsByName("uname")[0];

      console.log(txt);

    </script>

  </body>

</html>

运行结果:


333.png
3. 按选择器查找:

(1). 问题: 如果元素藏的很深,无法用一个条件一次性找到,则用以上两种方式查找,代码会很繁琐。
(2). 解决: 今后,只要无法凭借一个查询条件就能直接获得元素,都可以用选择器查找。
(3). 如何: 2个函数
a. 只查找一个符合要求的元素
1). var 一个元素对象=任意父元素.querySelector("任意css3选择器");
在任意父元素下查找元素
按选择器
2). 返回值:
i. 如果找到符合要求的元素,就返回一个元素对象
ii. 如果没找到返回null
3). 强调:
i. 可以用任意父元素作为.前的主语用来缩小查找范围。当然也可以用document。
ii. 不止查找直接子元素,而且在所有后代中查找。
b. 查找多个符合要求的元素:
1). var 类数组对象=任意父元素.querySelectorAll("任意css3选择器")
在任意父元素下查找 所有符合要求的元素
按选择器
2). 返回值:
i. 如果找到符合要求的元素,则返回一个类数组对象
ii. 如果没找到符合要求的元素,则返回空类数组对象: { length:0 }
3). 强调:
i. 可以用任意父元素作为.前的主语用来缩小查找范围。当然也可以用document。
ii. 不止查找直接子元素,而且在所有后代中查找。

4. 示例: 购物车效果

(1). 所有DOM效果,都可以标准的DOM4步来实现:
a. 先查找触发事件的元素
b. 为元素绑定事件处理函数
c. 再查找要修改的元素
d. 修改元素
(2). 点按钮,修改数量
a. 先查找触发事件的元素: 本例中查找table下所有button元素
b. 为元素绑定事件处理函数:
1). 什么是事件: 浏览器自动触发的或用户手工触发的页面中内容或状态的改变。
2). 什么是事件处理函数: 当事件发生时,我们希望自动执行的一个个任务函数。
3). 何时: 今后,只要希望每当元素上发生一个事件时,都能自动执行一项操作,都用事件处理函数
4). 如何: 都要提前将一个函数,保存到元素对象身上的一个专门的事件属性上。——事件绑定:2种
i. 在HTML中: 2步
先在<script>中定义一个函数(也可以放在<body>结尾)
再在<body>中HTML元素上为元素添加事件属性,并将函数调用语句保存在事件属性上。
<元素 on事件名="函数名()">

111.png

问题: 因为只能手工添加,所以极其不便于维护。
ii. 在js中绑定:
先在js中查找到要触发事件的元素
再为元素对象的事件属性赋值一个事件出路函数
元素对象.on事件名=function(){ ... }
优点: 可以用程序批量自动完成!


dom5.png

5). 结果: 每当浏览器侦测到这个元素上发生了一个事件/改变时,都会自动在这个元素身上查找与当前事件匹配的事件属性。然后,自动调用这个事件属性上提前保存的事件处理函数。
6). 问题: 在事件处理函数中,想获取当前触发事件的元素本身。如果使用事件处理函数外的全局变量,不靠谱。因为事件处理函数是在将来单击时才触发执行,而在元素被单击之前,全局遍历可能早就发生变化了!
7). 解决: 今后,只要想在事件处理函数内,自动获得正在触发事件的当前元素对象,可用this关键字!而不要用全局变量!


dom6.png

8). 扩展: 为什么改成let不好:
c. 再查找要修改的元素: (要放在事件处理函数内)
本例中: 查找当前按钮的爹的第二个孩子span
dom7.png

d. 修改span元素的内容:
1). 先获取span元素的内容,转为整数
2). 修改span元素的内容:

如果当前按钮的内容是+
就将整数+1
否则如果当前按钮的内容是-,并且整数的还值>1
才能整数-1
3). 最后,将计算出的新值再放回span的内容中
e. 示例: 实现点击按钮修改数量:
shoppingCart_0.html
(3). 数量修改,计算小计
a. 查找触发事件的元素——已完成
b. 绑定事件处理函数——已完成
c. 查找要修改的元素——要写在事件处理函数中
d. 修改元素——要写在事件处理函数中


dom9.png

(4). 小计修改,计算总价
a. 查找触发事件的元素——已完成
b. 绑定事件处理函数——已完成
c. 查找要修改的元素——要写在事件处理函数中
d. 修改元素——要写在事件处理函数中
xom11.png

e. 示例: 实现小计变化,计算总价:
shoppingCart.html
<!DOCTYPE HTML>
<html>
<head>
  <title>使用Selector API实现购物车客户端计算</title>
  <meta charset="utf-8" />
  <style>
    table {
      width: 600px;
      text-align: center;
      border-collapse: collapse;
    }
    td,
    th {
      border: 1px solid black
    }
    td[colspan="3"] {
      text-align: right;
    }
    /*想让tbody下每行最后一个td背景变为粉色*/
    tbody td:last-child{
      background-color:pink
    }
    /*想让tfoot下最后一个td背景变为黄色*/
    tfoot td:last-child{
      background-color:yellow
    }
  </style>
</head>
<body>
  <table id="data">
    <thead>
      <tr>
        <th>商品名称</th>
        <th>单价</th>
        <th>数量</th>
        <th>小计</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>iPhone6</td>
        <td>¥4488.00</td>
        <td>
          <button>-</button>
          <span>1</span>
          <button>+</button>
        </td>
        <td>¥4488.00</td>
      </tr>
      <tr>
        <td>iPhone6 plus</td>
        <td>¥5288.00</td>
        <td>
          <button>-</button>
          <span>1</span>
          <button>+</button>
        </td>
        <td>¥5288.00</td>
      </tr>
      <tr>
        <td>iPad Air 2</td>
        <td>¥4288.00</td>
        <td>
          <button>-</button>
          <span>1</span>
          <button>+</button>
        </td>
        <td>¥4288.00</td>
      </tr>
    </tbody>
    <tfoot>
      <tr>
        <td colspan="3">Total: </td>
        <td>¥14064.00</td>
      </tr>
    </tfoot>
  </table>
  <script>
    //DOM 4步: 
    //1. 查找触发事件的元素: 
    //本例中:查找table下的所有button元素
    //1.1 先查找id为data的table
    var table=document.getElementById("data");
    //1.2 再查找table下所有button元素
    var buttons=table.getElementsByTagName("button");
    console.log(buttons);
    //2. 为元素绑定单击事件:
    //遍历查找结果buttons中每个按钮对象
    for(var button of buttons){
      //每遍历一个按钮对象button,就为当前按钮赋值一个事件处理函数
      button.onclick=function(){
        //希望点哪个按钮,让哪个按钮的内容变小花
        //错误:全局变量button,在循环结束后已经指向最后一个按钮
        // button.innerHTML="❀";
        //正确: 
        // this.innerHTML="❀";
        //3. 查找要修改的元素
        //本例中: 查找当前按钮的爹的第二个孩子
        var span=this.parentElement.children[1];
        //4. 修改元素
        //4.1 先获取span元素中的旧内容,转为数字
        var n=parseInt(span.innerHTML);
        //4.2 再对数字+1或-1
        //如果当前按钮的内容是+
        if(this.innerHTML=="+"){
          n++;//就n++;
        }else if(n>1){
        //否则如果当前按钮的内容是-,并且n的值还>1
          n--;//才n--;
        }
        //4.3 再将计算出来的新数字放回span元素的内容中
        span.innerHTML=n;
        /*功能二, 数量修改,计算小计*/
        //3. 查找要修改的元素
        //本例中:查找当前按钮的爹的下一个兄弟
        var tdSub=this.parentElement.nextElementSibling
        //4. 修改元素: 
        //4.1 先获得单价
        var price=parseFloat(
          this //当前按钮
          .parentElement //当前按钮所在td
          .previousElementSibling //当前td的前一个兄弟td
          .innerHTML //前一个td的内容
          .slice(1) //选取除了开头¥以外的剩余字符串
        );
        //4.2 单价*数量算出小计
        var sub=price*n;
        //4.3 将小计放入小计单元格的内容中
        tdSub.innerHTML=`¥${sub.toFixed(2)}`;
        /*功能三: 修改小计,计算总计*/
        //3. 查找要修改的元素
        //本例中: 最终要修改tfoot中最后一个总价单元格的内容
        var tdTotal=document.querySelector(
          "tfoot td:last-child"
        );
        console.log(tdTotal);
        //4. 修改元素
        //4.1 先获得tbody中每行最后一个小计td
        var tds=document.querySelectorAll(
          "tbody td:last-child"
        )
        console.log(tds);
        //4.2 遍历查找结果中每个小计td
        //先定义一个变量total=0,准备临时保存累加的总价
        var total=0;
        for(var td of tds){
          //每遍历一个td,就获得当前td的内容,去掉¥,转数字后累加成总价
          total+=parseFloat(td.innerHTML.slice(1));
        }
        //4.3 将总价放入到tfoot中最后一个总价单元格中。
        tdTotal.innerHTML=`¥${total.toFixed(2)}`;
      }
    }
  </script>
</body>
</html>

运行结果:


dom12.png

二. 修改: 3种东西: 内容,属性,样式

1. 内容: 3种

(1). 获取或修改元素开始标签到结束标签之间的原始的HTML内容
元素.innerHTML
内部 HTML
(2). 获取或修改元素开始标签到结束标签之间的纯文本内容:
a. 元素.textContent
文本 内容
b. 获取时: 比innerHTML多做2件事:
1). 去掉了内嵌的标签
2). 将特殊符号翻译为正文。
c. 修改时:
1). .innerHTML,会先将内容交给浏览器解析,然后显示解析后的可以给人看的结果
2). .textContent,不会将内容交给浏览器解析,而是无论多难看,都原样显示!
d. 总结: 建议:
1). 如果要操作的内容中包含HTML元素或特殊符号,首先innerHTML
2). 如果要操作的内容中不包含HTML元素或特殊符号,则innerHTML和textContent都行!
(3). 获取和修改表单元素的值:
a. 问题: 大部分表单元素,比如input,都是单标记,没有结束标签,所以无法使用innerHTML或textContent获取或修改元素的内容
b. 解决: 今后,只要先获取或修改任何一个表单元素的值,统一都用.value属性。
(4). 示例: 获取和修改各种元素的内容,比较差别:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h3 id="msg1">来自<<<a href="#">新华社</a>>>的消息</h3>
  <h3 id="msg2"></h3>
  <h3 id="msg3"></h3>
  <input id="txt"><button id="btn">百度一下</button>
  <script>
    //用两种方式获取msg1的内容
    var msg1=document.getElementById("msg1");
    console.log(msg1.innerHTML);
    console.log(msg1.textContent);
    //分别给两个h3赋值相同带有内嵌HTML标签的内容: 
    var msg2=document.getElementById("msg2");
    var msg3=document.getElementById("msg3");
    msg2.innerHTML=`来自<<<a href="#">新华社</a>>>的消息`;
    msg3.textContent=`来自<<<a href="#">新华社</a>>>的消息`;
    //想点击按钮,就能获得文本款中的内容,执行搜索操作
    var btn=document.getElementById("btn");
    btn.onclick=function(){
      var txt=document.getElementById("txt");
      console.log(`搜索${txt.value}相关的内容...`);
    }
  </script>
</body>
</html>

运行结果:


dom14.png

(5). 示例: 实现开关门效果:
0_door.html

<!DOCTYPE HTML>
<html>
<head>
  <title>读取并修改元素的内容</title>
  <meta charset="utf-8" />
  <style>
    div {
      float: left;
      height: 100px;
      line-height: 100px;
    }
    #d1,
    #d3 {
      background-color: #ccff00;
    }
    #d2 {
      cursor: pointer;
      background-color: #ffcc00;
    }
  </style>
</head>

<body>
  <div id="d1">树形列表</div>
  <div id="d2">&lt;&lt;</div>
  <div id="d3">内容的主体</div>
  <script>
    //DOM 4步
    //1. 查找触发事件的元素
    //本例中: 查找id为d2的div
    var d2=document.getElementById("d2");
    //2. 绑定事件处理函数
    d2.onclick=function(){
      //3. 查找要修改的元素
      //本例中: 查找id为d1的div
      var d1=document.getElementById("d1");
      //4. 修改元素
      //如果当前d2的箭头<<,说明当前d1是开着的
      if(this.innerHTML=="&lt;&lt;"){
        //就把d1关上(隐藏)
        //HTML中手工隐藏: 
        //<元素 style="display:none">
        //js中:
        d1.style.display="none";
        //将当前d2的箭头改为>>
        this.innerHTML="&gt;&gt;"
      }else{//否则当前d2的箭头>>,说明当前d1是关着的
        //就把d1打开
        //HTML中手工显示:
        //<元素 style="display:block">
        //js中: 
        d1.style.display="block";
        //将当前d2的箭头改为<<
        this.innerHTML="&lt;&lt;";
      }
    }
  </script>
</body>
</html>

运行结果:


kaiguanmen1.png

kaiguanmen2.png
2. 属性: 3种

(1). 字符串类型的HTML标准属性
a. 什么是: HTML标准中规定的,属性值为字符串类型的属性:
b. 比如: name, class, id, title, href, src, ...
c. 如何: 2种:
1). 旧DOM中的核心函数:4个
i. 获取一个属性的值: 元素.getAttribute("属性名")
获取 属性 值
ii. 修改一个属性的值: 元素.setAttribute("属性名", "属性值")
修改 属性 值
iii. 判断一个元素是否包含某个属性: 元素.hasAttribute("属性名")
是否有 这个属性
iv. 移除一个元素上的某个属性: 元素.removeAttribute("属性名")
移除 属性
2). 新HTML DOM中提供了一组简写:
i. 前提: HTML DOM中已经将所有字符串类型的HTML标准属性提前保存在了内存中元素对象身上。只不过暂时没有用的属性值默认为空字符串""
ii. 如何用HTML DOM实现以上四个功能:
获取一个属性的值: 元素.属性名
 修改一个属性的值: 元素.属性名=属性值
判断元素是否包含某个属性: 元素.属性名!==""
移除一个属性: 元素.属性名=""
3). 示例: 分别使用核心DOM和HTML DOM操作元素的属性:
1_attribute.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <a id="a1" href="http://tmooc.cn">go to tmooc</a>
  <script>
    var a1=document.getElementById("a1");
    //旧核心DOM 4个函数
    // //想获得a1的href属性值
    // console.log(a1.getAttribute("href"));
    // //想修改a1的target属性值
    // a1.setAttribute("target","_blank");
    // //想判断a1中是否包含id属性
    // console.log(a1.hasAttribute("id"));//true
    // //想移除a1的id属性
    // a1.removeAttribute("id");
    // //再次判断a1中是否包含id属性
    // console.log(a1.hasAttribute("id"));//false

    //新HTML DOM
    console.dir(a1);
    //想获得a1的href属性值
    console.log(a1.href);
    //想修改a1的target属性值
    a1.target="_blank";
    //想判断a1中是否包含id属性
    console.log(a1.id!=="");//true
    //想移除a1的id属性
    a1.id="";
    //再次判断a1中是否包含id属性
    console.log(a1.id!=="");//false  
    console.log(a1);
  </script>
</body>
</html>

运行结果:


dom属性.png

总结: DOM4步

  1. 查找触发事件的元素
    2. 绑定事件处理函数
    3.查找要修改的元素
  2. 修改元素
    总结: DOM 5件事: 增删改查+事件绑定:
    //不要背!用到时,来查找,复制粘贴就行了!
    1. 查找元素: 4种
    (1). 不需要查找就可直接获得的元素对象: 4种:
    document 根节点 document
    document.documentElement —— <html>
    document.head —— <head>
    document.body —— <body>
    (2). 如果已经获得一个元素对象,找周围附近的元素对象时,就用按节点间关系查找:2大类关系,6个属性
    a. 父子关系: 4种
    1). 元素的父元素: 元素.parentElement
    2). 元素下的所有直接子元素: 元素.children
    3). 元素下的第一个直接子元素: 元素.firstElementChild
    4). 元素下的最后一个直接子元素: 元素.lastElementChild
    b. 兄弟关系: 2种
    1). 元素的前一个兄弟: 元素.previousElementSibling
    2). 元素的后一个兄弟: 元素.nextElementSibling (3). 如果用一个特征就能找到想要的元素,就用按HTML特征查找:4个方法:
    a. 按id查找:
    var 一个元素对象=document.getElementById("id名");
    b. 按标签名查找:
    var 类数组对象=任意父元素.getElementsByTagName("标签名")、
    c. 按class名查找:
    var 类数组对象=任意父元素.getElementsByClassName("class名")
    d. 按name名查找表单元素:
    var 类数组对象=document.getElementsByName("name名")
    (4). 如果通过复杂的查找条件,才能找到想要的元素时,就用按选择器查找: 2个方法
    a. 只查找一个符合条件的元素:
    var 一个元素=任意父元素.querySelector("任意选择器")
    b. 查找多个符合条件的元素:
    var 类数组对象=任意父元素.querySelectorAll("任意选择器")
总结: 查找函数的返回值规律: 3种

1. 如果原函数返回的是下标位置i, 则如果找不到-1

2. 如果原函数返回的是一个数组或一个对象,则如果找不到返回null

3. 如果原函数返回的是类数组对象,则如果找不到,返回空类数组对象: {length:0 }

|

2. 修改元素: 3种东西可修改
(1). 修改内容: 3种内容可修改:
a. 获取或修改元素的HTML内容:
元素.innerHTML
b. 获取或修改元素的纯文本内容:
元素.textContent
c. 获取或修改表单元素的值:
表单元素.value
(2). 修改属性: 3种
a. 字符串类型的HTML标准属性: 2种:
1). 旧核心DOM: 4个函数
i. 元素.getAttribute("属性名");
ii. 元素.setAttribute("属性名", "属性值")
iii. var bool=元素.hasAttribute("属性名")
iv. 元素.removeAttribute("属性名")
优点: 万能, 缺点: 繁琐
2). 新HTML DOM:
i. 元素.属性名
ii. 元素.属性名="属性值"
iii. 元素.属性名!==""
i. 元素.属性名=""
优点: 简单, 缺点: 不万能
总结: this 6种:
2. new Fun() this->new正在创建的新对象
3. 类型名.prototype.共有方法=function(){... }
this->将来谁调用这个函数,就指谁
将来调用这个函数的.前的某个子对象
4. fun() 和回调函数 和匿名函数自调 this->默认指window

  1. 访问器属性中的this指访问器属性所在的当前对象
    6. 在DOM的事件处理函数内的this->当前正在触发事件的DOM元素对象
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容