DOM的查找与修改

查找:

1. 按选择器查找: 今后如果元素藏的很深,非常分散时,查找条件变得很复杂,都可用按选择器查找.

  (1). 只查找一个符合要求的元素

  a. var 一个元素对象=任意父元素.querySelector("选择器")

                                    按选择器

                                查询

  (2). 查找多个符合要求的元素

  b. var 类数组对象=任意父元素.querySelectorAll("选择器")

DOM的查找与修改

修改: 3种东西

1. 内容: 3种:

  (1). 获取或修改元素开始标签到结束标签之间的原始的HTML内容

  a. 元素对象.innerHTML

             内部 HTML内容

  b. 获取元素内容时: innerHTML原样返回HTML代码中的html内容个,不做任何加工

  c. 修改元素内容时: innerHTML会先将字符串内容交给浏览器解析,然后将解析后的可以给人看的内容显示在页面上

  (2). 获取或修改元素开始标签到结束标签之间的纯文本内容

  a. 元素对象.textContent

             文本 内容

  b. 获取元素内容时: textContent去掉内嵌的标签,并将特殊符号转为正文,然后在返回修改后的内容。

  c. 修改元素内容: 不会将字符串内容交给浏览器解析,而是直接保持字符串的原样内容输出

  d. 示例: 分别使用innerHTML和textContent获取和修改元素的内容

  0_html_text_value.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>
  <h3 id="msg">来自<a href="#">&lt;&lt;新华社&gt;&gt;</a>的消息</h3>
  <h3 id="msg2"></h3>
  <h3 id="msg3"></h3>
  <script>
    var h3Msg=document.getElementById("msg");
    var h3Msg2=document.getElementById("msg2");
    var h3Msg3=document.getElementById("msg3");
    //想获取msg的内容
    console.log(h3Msg.innerHTML)    
    console.log(h3Msg.textContent) 
    //想修改msg2和msg3的内容
    var str=`来自<a href="#">&lt;&lt;新华社&gt;&gt;</a>的消息`; 
    h3Msg2.innerHTML=str;
    h3Msg3.textContent=str;  
  </script>
</body>
</html>

运行结果:

DOM的查找与修改

  (3). 获取或修改表单元素的内容:

  a. 问题: 绝大多数表单元素都是input元素,而input元素是单标记,没有结束标签,所以不能使用innerHTML和textContent来获取或修改内容
  b. 解决: 今后只要获取或修改表单元素的值,都要用value代替innerHTML和textContent.

 (4). 示例: 开关门效果:

  0_door.html

<!DOCTYPE HTML>
<html>

<head>
  <title>读取并修改元素的内容</title>
  <meta charset="utf-8" />
  <style>
    div {
      float: left;
      width: 110px;
      height: 200px;
    }

    #d1{
      background-color:#ccff00;
      background-image:url(images/xsj.png);
      background-size:160% 80%;
      background-position:-30px 30px;
    }
    #d3 {
      background-image:url(images/men.png);
      background-size:110% 110%;
      background-position:-10px -10px;
      position:relative;
    }

    #d2 {
      cursor: pointer;
      background-color:#fff;
      position:absolute;
      width:40px; height:18px;
      text-align:center;
      top:65px;
      font-weight:bold;
      color:green;
      left:50%; margin-left:-20px;
    }
  </style>
</head>

<body>
  <div id="d1"></div>
  <div id="d3">
    <div id="d2">无人</div>
  </div>
  <script>
    //DOM 4步
    //1. 查找触发事件的元素
    //本例中: 点d2可以开关门
    var d2=document.getElementById("d2");
    //2. 绑定事件处理函数
    d2.onclick=function(){
      //3. 查找要修改的元素
      //本例中: 开关门是通过显示或隐藏d1(洗手间)来实现的
      var d1=document.getElementById("d1");
      //4. 修改元素
      //如果当前d2的内容是"无人"
      if(this.innerHTML=="无人"){
        //就关门
        d1.style.display="none"
        //相当于手工:
        //<div id="d1" style="display:none">
        d2.innerHTML="有人";
        d2.style.color="red";
      }else{//否则如果当前d2的内容是"有人"
        //就开门
        d1.style.display=""
        d2.innerHTML="无人";
        d2.style.color="green";
      }
    }
  </script>
</body>

</html>

运行结果:

DOM的查找与修改

DOM的查找与修改

2. 属性: 3种属性:

  (1). 字符串类型的HTML标准属性:

  a. 什么是: HTML标准中规定的,属性值为字符串的属性

  b. 比如: class, id, name, value, href, title, ...

  c. 如何: 2种方式:

    1). 旧核心DOM4个函数:

    i. 获取属性值: 元素对象.getAttribute("属性名")

                         获取 属性

    ii. 修改属性值:

           元素对象.setAttribute("属性名", "新值")

              修改 属性

    iii. 判断是否包含某个属性:

      元素对象.hasAttribute("属性名")

               有  属性(吗?)

    iv. 移除属性: 元素.removeAttribute("属性名")

                       移除   属性

    2). 新的简化版HTML DOM:

    i. 新的HTML DOM已经将所有HTML标准属性,提前保存在了内存中的元素对象身上。只不过页面上暂时没用到的属性,默认值为""而已.

    ii. 今后,只要操作HTML标准属性,就都可用".属性名"方式操作

    iii. 如何用.代替以上四种操作:

      ①获取属性值: 元素对象.属性名

      ②修改属性值: 元素对象.属性名=属性值

      ③判断是否包含某个属性:

        因为所有标准属性已经在元素对象身上了,只不过默认值为"",所以:

        元素.属性名!==""  说明包含该属性

      ④移除属性:

         错误: delete 元素对象.属性名

         正确: 元素对象.属性名=""

    iv. 特例: class属性

      问题: ES6基础语法中已经将class定义为关键字,有特殊功能,专门用于创建一种类型。所以,DOM标准就不能重复使用"class"这个属性名。

      解决: 今后,在DOM中只要用.获取或修改元素的class属性值,都必须换成".className"。

      但是,操作.className,就是在操作页面上元素的class属性。

  d. 示例: 使用核心DOM和HTML DOM两种方式操作a元素的属性:

  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" title="前往tmooc">go to tmooc</a>
  <script>
    var a1=document.getElementById("a1");
    //获取a1的href属性
    // console.log(a1.getAttribute("href"));
    console.log(a1.href);
    //修改a1的title属性
    // a1.setAttribute("title","Welcome to tmooc");
    a1.title="Welcome to tmooc";
    //判断是否包含target属性
    // console.log(a1.hasAttribute("target"));//false
    console.log(a1.target!=="");//false 说明不包含
    //为a1添加target属性
    // a1.setAttribute("target","_blank")
    a1.target="_blank";
    //判断是否包含target属性
    // console.log(a1.hasAttribute("target"));//true
    console.log(a1.target!=="");//true 说明包含
    console.log(a1);
    console.dir(a1);
  </script>
</body>
</html>

 

运行结果: 

DOM的查找与修改

e. 示例: 手风琴/伸缩菜单效果

  1_menu.html

DOM的查找与修改

<!DOCTYPE HTML>
<html>

<head>
  <title>1. 实现伸缩二级菜单</title>
  <meta charset="utf-8" />
  <style>
    li {
      list-style: none;
    }

    li span {
      padding-left: 20px;
      cursor: pointer;
      background: url("images/add.png") no-repeat center left;
    }

    li ul {
      display: none;
    }

    .open {
      background: url("images/minus.png") no-repeat center left;
    }

    .open+ul {
      display: block;
    }
  </style>

</head>

<body>
  <ul class="tree">
    <li>
      <span class="open">考勤管理</span>
      <ul>
        <li>日常考勤</li>
        <li>请假申请</li>
        <li>加班/出差</li>
      </ul>
    </li>
    <li>
      <span>信息中心</span>
      <ul>
        <li>通知公告</li>
        <li>公司新闻</li>
        <li>规章制度</li>
      </ul>
    </li>
    <li>
      <span>协同办公</span>
      <ul>
        <li>公文流转</li>
        <li>文件中心</li>
        <li>内部邮件</li>
        <li>即时通信</li>
        <li>短信提醒</li>
      </ul>
    </li>
  </ul>
  <script>
    //DOM 4步
    //1. 查找触发事件的元素
    //本例中: 点击ul下li下所有span都能触发变化
    var spans=document.querySelectorAll(
      "ul>li>span"
    );
    //2. 绑定事件处理函数
    //本例中: 因为要给每个span绑定单击事件,所以要遍历找到的每个span
    for(var span of spans){
      span.onclick=function(){
        //3. 查找要修改的元素
        //4. 修改元素
        //如果当前点击的span的class是open,说明当前span是打开的,则只关闭自己即可!不用再遍历别人了
        if(this.className=="open"){
          this.className="";
          return;//停止执行当前函数,并退出当前函数。
        }

        //先找到ul下所有span
        var spans=
          document.querySelectorAll(
            "ul>li>span"
          );
        //遍历清除每个span上的class open,让所有的菜单暂时都隐藏
        for(var span of spans){
          span.className="";
        }
        //然后,再只给当前点击的一个span添加class open,只让当前一个菜单显示
        this.className="open";
      }
    }
  </script>
</body>

</html>

运行结果:

DOM的查找与修改

 

 (2). bool类型的HTML标准属性: 

  a. 什么是: HTML标准中规定的,不需要写属性值,只靠属性名就可发挥作用的属性。

  b. 比如: 

    1). checked: 用于标记一个checkbox是否被选中

    2). disabled: 用于标记一个表单元素是否被禁用

    ... ...

  c. 如何: 2种: 

    1). 即可用核心DOM 4个函数

    i. 添加bool类型的HTML标准属性:

  标准写法:  元素.setAttribute(“属性名”,”属性名”)

  比如:

  input.setAttribute(“disabled”,”disabled”);//禁用文本框

  结果: <input disabled=“disabled”>

  简写:

  只要添加了disabled属性,就起作用,不给值也行

  元素.setAttribute(“属性名”,””)

  比如: input.setAttribute(“disabled”,””);//禁用文本框

  结果: <input disabled=“”>

    ii.移除bool类型HTML标准属性

  元素.removeAttribute(“属性名”)

      比如:

      input.removeAttribute(“disabled”) //启用文本框

      结果: <input disabled />

    iii. 判断元素当前处于何种状态

      元素.hasAttribute(“属性名”)

      结果: 有哪个属性,就说明处于哪种状态

        没有哪个属性,说明没有处于哪种状态

      比如: input.hasAttribute(“disabled”)//判断文本框是启用,还是禁用

   2). 又可用新HTML DOM来操作

      元素.属性名

  且属性值必须是bool类型的true或false。

  比如:

  判断元素现在处于何种状态: 元素.属性名

  修改状态: 元素.属性名=bool值

总结: 

(4). 如果通过复杂的查找条件,才能找到想要的元素时,就用按选择器查找: 2个方法

a. 只查找一个符合条件的元素:

var 一个元素=任意父元素.querySelector("任意选择器")

b. 查找多个符合条件的元素:

var 类数组对象=任意父元素.querySelectorAll("任意选择器")

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. 元素.属性名!==""

  iv. 元素.属性名=""

  优点: 简单, 缺点: 不万能

b. bool类型的HTML标准属性:2种

  1). 旧核心DOM4个函数修改: 

    //启用某种状态

    元素.setAttribute("属性名","属性名"或"")

//禁用某种状态

    元素.removeAttribute("属性名")

//判断是否处于某种状态

    元素.hasAttribute("属性名")

  2). HTML DOM的"元素.属性名",值为bool类型

     //启用某种状态

    元素.属性名=true

//禁用某种状态

    元素.属性名=false

//判断是否处于某种状态

    元素.属性名

上一篇:111


下一篇:C++学习之第五天