Web APIs /APIs --DOM简述/DOM中获取元素方法/事件(含鼠标事件)/操作(含案例)

Web APIs
Web APIs 和 JS 的关联性:
Web APIs是 W3C 组织的标准,主要学习DOM 和 BOM
Web APIs是 JS 所独有的部分
主要学习页面交互功能
Web APIs 是 JS 的应用
总结:
API 是一种接口工具,以实现某些功能,只要会使用就可以了
Web APIs是浏览器提供的一套操作浏览器功能(BOM) 和 页面元素(DOM)的API
Web APIs 一般都有输入和输出,Web APIs很多都是方法(函数)
可以结合前面学习内置对象方法的思路学习
DOM
DOM是文档对象模型,是W3C推荐的处理可扩展标记语言的一套标准程序接口,即处理页面/文档的一些接口
W3C已经规定了一系列的DOM接口,通过这些接口可以改变网页的结构、和样式

DOM树

文档(document):一个页面就是一个文档;
元素(Element):页面中的所有标签都是元素;
节点(Node):页面中的内容都是节点,例如:标签,文本,属性,注释等;
DOM把以上内容都看成是对象

DOM在实际操作中获取元素的方法:
1. 根据ID获取

getElementById(‘id’) 方法可以获取带有ID的元素对象
因为文档页面从上往下加载,所以先要有标签,所以script放在标签下面
驼峰命名法 get 获得Element 元素 by
参数id 是大小写敏感的字符串
返回的是一个元素对象
    <div id="time">2020-10-01</div>
    <script>
      //1.因为文档页面从上往下加载,所以先要有标签,所以script放在标签下面
      //2.驼峰命名法  get 获得Element 元素 by
      //3.参数id 是大小写敏感的字符串
      //4.返回的是一个元素对象
      var timer = document.getElementById("time");
      console.log(timer); //把标签选中了
      console.log(typeof timer);//返回object
      //5.console.dir打印返回的元素对象,更好地查看属性里面的属性和方法
      console.dir(timer);

2. 根据标签名获取

  • getElementsByTagName(‘标签名’) 方法可以返回页面内所有的带有指定标签名的对象的集合
  • 返回的是获取过来元素对象的集合,以伪数组形式存储
       <ul>
          <li>如月之恒,如日之升1</li>
          <li>如月之恒,如日之升2</li>
          <li>如月之恒,如日之升3</li>
          <li>如月之恒,如日之升4</li>
          <li>如月之恒,如日之升5</li>
        </ul>
        <ol>
          <li>empty</li>
          <li>empty</li>
          <li>empty</li>
        </ol>
       <script>
          //(1)getElementsByTagName 方法可以返回带有指定标签名的对象的集合
          //(2)返回的是获取过来元素对象的集合,以伪数组形式存储
          var lis = document.getElementsByTagName("li");
          console.log(lis);
          console.log(lis[0]); //得到第一行的li
          //(3)想要依次得到元素对象可以采取遍历的方式
          for (var i = 0; i < lis.length; i++) {
            console.log(lis[i]);
          }
      </script>
    

    注意:
    1.因为得到的是一个对象的集合,所以想要操作里面的元素就需要遍历
    2.得到的元素对象是动态的(即原对象一旦变化,得到的结果也会随之变化)
    3.如果页面中只有一个元素,返回的依然是元素对象,伪数组
    4.如果页面中没有元素,返回的是空的伪数组
    5.element(父元素).getElementsByTagName(’标签名’);可以获取某个元素 (父元素)内部所有指定标签名的子元素
    ///父元素必须是单个对象(必须指明是哪个对象),获取时不包括父元素自己
    例:此处必须是 ’ ol[0] . getElementsByTagName(“li”) ’

       <ul>
          <li>如月之恒,如日之升1</li>
          <li>如月之恒,如日之升2</li>
          <li>如月之恒,如日之升3</li>
          <li>如月之恒,如日之升4</li>
          <li>如月之恒,如日之升5</li>
        </ul>
        <ol>
          <li>empty</li>
          <li>empty</li>
          <li>empty</li>
        </ol>
       <script>
          //(1)getElementsByTagName 方法可以返回带有指定标签名的对象的集合
          //(2)返回的是获取过来元素对象的集合,以伪数组形式存储
          var lis = document.getElementsByTagName("li");
          console.log(lis);
          console.log(lis[0]); //得到第一行的li
          //(3)想要依次得到元素对象可以采取遍历的方式
          for (var i = 0; i < lis.length; i++) {
            console.log(lis[i]);
          }
      </script>
    

    //这样过于麻烦,经常做出改进:给ol一个id值

        <ol id="ol">-----</ol>
        -------------------------------------------
         //改进
          var ol = document.getElementById("ol");
          console.log(ol.getElementsByTagName("li"));
    

    3. 根据HTML5新增的方法获取

    ie9以上才可使用,有兼容性问题

  • getElementsByClassName(‘类名’) 根据类名获取
     <div class="box">盒子</div>
     <script>
         //**3.HTML5新增方法  getElementsByClassName 根据类名获取 
          var boxs = document.getElementsByClassName('box');
          console.log(boxs);
     </script>
    

  • document.querySelector(‘选择器’) 根据指定选择器返回第一个元素对象
    (切记 里面的选择器需要加符号 : 类选择器加 . id选择器加 # 标签选择器不用加)

    //(2) document.querySelector('选择器')根据指定选择器返回第一个元素对象
      var firstBox= document.querySelector('.box'); //返回第一个类名为box的元素
      console.log(firstBox);
      var nav = document.querySelector('#nav'); //返回第一个id为nav的元素
      console.log(nav);
      var li = document.querySelector('li');  //返回第一个li
      console.log(li);
  • document.querySelectorAll(‘选择器’) 根据指定选择器返回所有元素对象
    返回对象是一个元素集合,是一个伪元素
    同样的,里面的选择器需要加符号
          //(3)document.querySelectorAll('选择器')  根据指定选择器返回所有元素对象
          //返回对象是一个元素集合,是一个伪元素
          var allBox = document.querySelectorAll(".box"); //返回所有类名为box的元素
          console.log(allBox);
    

    4. 特殊元素获取

  • document.body获取body标签
     var bodyEle = document.body;
          console.log(bodyEle); //获取body标签
          console.dir(bodyEle); //返回的类型是数组对象
    

    • document.documentElement 获取html标签
       //(2)获取html标签
            var htmlEle = document.documentElement;
            console.log(htmlEle); //获取html标签
            console.dir(htmlEle); //返回的类型是数组对象
      

      事件基础

      javascript使我们有能力创建动态页面(轮播图等) ,而事件是可以被javascript侦测到的行为
      简单理解:就是一种 触发-----响应机制

      事件由三部分组成:事件源、事件类型、事件处理程序(事件三要素)
      (1)事件源:事件被触发的对象 例如 按钮`````````````                                                                                                                                                                                                                

       <button id="btn">阿妫</button>
       <script>
            var btn = document.getElementById("btn");
      

      (2)事件类型 即触发的方式,例:鼠标点击触发(onclick)/鼠标经过触发/键盘按下触发等
      (3)事件处理程序 通过一个函数赋值的方式完成

         btn.onclick = function(){
            alert('好的啊');  //点击按钮后弹出对话框
        }
       </script>
      
      鼠标事件    触发条件
      onclick    鼠标点击左键触发
      onmouseover    鼠标移动到目标上方
      onmouseout    鼠标从目标上方移出
      onfocus    获得鼠标焦点触发
      onmousedown    鼠标的键钮被按下
      onmouseup    鼠标的键钮释放弹起
      onblur    失去鼠标焦点触发
      mousemove    鼠标在目标上方移动

  • mouseenter 和 mouseover 区别:

    mouseover 鼠标经过自身盒子会触发,经过子盒子还会触发

    mouseenter 只会经过自身盒子触发(因为 mouseenter 不会冒泡)

    操作元素(重要)
    javascript 的DOM操作都可以改变网页内容、样式,可以利用DOM操作元素来改变元素里面的内容、属性等

    改变元素内容

    element.innerText 从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会被去掉
     

    <body>
        <button id="btn">显示当前系统时间</button>
        <div>某个时间</div>
        <p></p>
        <script>
          //**当点击按钮div里面的文字会发生变化**
          //1.获取元素
          var btn = document.querySelector("button");
          var div = document.querySelector("div");
          //2.注册事件
          btn.onclick = function () {
            //点击后按指定格式获取时间
            div.innerText = getDate();
          };
          //3.也可以不用添加事件,直接显示
          var p = document.querySelector("p");
          p.innerText = getDate();
          
          //封装时间函数
          function getDate() {
          ---------略---------;
          }
    

    -element.innerHTML 较多使用从起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行

    与element.innerText 使用方式一样。

    二者区别:
    (1)innerText 不识别HTML标签 非标准 不保留空格和换行

    (2)innerHTML 识别HTML标签 W3C推荐 保留空格和换行

    (3)这两个属性都是可读写的 可以获取元素里面的内容

    (4) 这两个是普通盒子,比如 div盒子标签的内容,对表单不起作用
     

    <body>
        <div></div>
        <p>
          我是文字
          <span> 123 </span>
        </p>
     <script>
       //innerText 和 innerHTML区别
       //1.innerText 不识别HTML标签  非标准  不保留空格和换行
       var div = document.querySelector("div");
       div.innerText = "<strong>今天是:</strong> 2020"; //显示<strong>今天是:</strong> 2020
       
       //2.innerHTML 识别HTML标签   W3C推荐   保留空格和换行
       var div = document.querySelector("div");
       div.innerMTML = "<strong>今天是:</strong> 2020"; //显示今天是:2020(其中'今天是'加粗)
       
       //3.这两个属性是可读写的 可以获取元素里面的内容
       var p = document.querySelector("p");
       console.log(p.innerText); //输出结果 我是文字 123   不保留空格和换行
       console.log(p.innerHTML); //输出结果 我是文字 <span> 123 </span>  保留空格和换行
     </script>
    </body>
    

    表单元素的属性操作

    利用DOM可以操作如下表单元素的属性

  • type
            btn.onclick(){
                //表单里面的值 文字内容通过value来修改
                input.value='被点击了';
            }
    

  • value
  • checked
  • selected
  • diabled
           btn.onclick(){
             //如果想要某个表单被禁用 不能再点击 用disabled
              input.disabled=true;
              //this 指向的是事件函数的调用者 btn
              this.disabled = true; //与input.disabled = true;效果等价
          }
    

    案例之密码显示与隐藏

    案例:点击按钮将密码框切换为文本框,并可以查看密码明文
    思路:点击眼睛按钮,把密码框类型转换为文本框就可以看见里面的密码, 一个按钮有两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
    算法:利用一个flag变量,判断flag值, 如果是1就切换为文本框,flag设置为0,如果是0就切换为密码框, flag设置为1
    代码:
     

    <style>
          .box {
            position: relative;
            width: 400px;
            border-bottom: 1px solid #ccc;
            margin: 100px auto;
          }
          .box input {
            width: 370px;
            height: 30px;
            border: 0;
            outline: none;
          }
          .box img {
            position: absolute;
            top: 7px;
            right: 2px;
            width: 24px;
            height: 24px;
          }
        </style>
      </head>
      <body>
        <div class="box">
          <label for="">
            <img src="images/zyl.jpg" alt="" id="eye" />
          </label>
          <input type="password" name="" id="pwd" />
        </div>
        <script>
          //1.获取元素
          var eye = document.getElementById("eye");
          var pwd = document.getElementById("pwd");
          //2.注册事件
          var flag = 0;
          eye.onclick = function () {
            if (flag == 0) {
              pwd.type = "text";
              eye.src = "images/zjl.jpg";
              flag = 1;
            } else {
              pwd.type = "password";
              eye.src = "images/zyl.jpg";
              flag = 0;
            }
          };
        </script>
      </body>
    

    样式属性操作

    可以通过JS修改元素的大小、颜色、位置等样式

  • element.style 行内样式属性
       <script>
          //1.获得元素
          var div = document.querySelector("div");
          //2.注册事件 处理程序
          div.onclick = function () {
          //点击后背景变为紫色,宽度变为250px
            this.style.backgroundColor = "purple";  
            this.style.width = "250px";
          };
        </script>
    

    div.style 里面的属性采取驼峰命名法

    (2)JS修改style样式操作,产生的是行内样式,CSS权重比较高,所以如果JS样式与内嵌样式发生冲突,以JS样式为主

    (3)适用于样式比较少,功能比较简单的

    实例:点击关闭二维码:

      <body>
        <div class="box">
          淘宝二维码
          <img src="images/zxc.jpg" alt="" title="扫面二维码" />
          <i class="close-btn">x</i>
        </div>
        <script>
          //思路:利用样式的显示与隐藏完成,display:none 隐藏元素  display:block 显示元素
          var btn = document.querySelector(".close-btn");
          var box = document.querySelector(".box");
          btn.onclick = function () {
            box.style.display = "none";
          };
        </script>
      </body>
    

    element.className 类名样式属性
    (1)通过修改 元素的className来修改元素样式,适用于样式多的,功能复杂的 (常用)
    (2)className是个保留字,因此使用className来操作元素类名属性
    (3)className 会直接更改元素的类名,会覆盖原先的类名
    (4)如果想要保留原先的类名,用多类名选择器
     

    <style>
         .first {
            width: 200px;
            height: 200px;
            background-color: rgb(140, 127, 219);
            color: salmon;
          }
          .change {
            width: 250px;
            height: 300px;
            background-color: violet;
            color: rgb(190, 201, 34);
          }
        </style>
      </head>
      <body>
        <div class='first'>文本</div>
        <script>
        //让原来的盒子由原来的样式改为类名为change所规定的样式
          var test = document.querySelector("div");
          test.onclick = function () {
            //让当前原色的类名改为change
            //this.className = "change";
            //如果想要保留原先的类名,用多类名选择器
            this.className = 'first change';
          };
        </script>
      </body>
    

    案例之:密码框格式提示错误信息
    案例:用户如果离开密码框,里面输入的个数不是6-16,则提示错误信息,否则提示输入正确信息
    思路:

    首先判断事件的表单失去焦点 onblur
    如果输入正确则提示正确的信息颜色为绿色小图标变化
    如果输入的不是6-16位,则提示错误信息颜色为红色 小图标变化
    因为里面的样式过多,采用className修改样式
     

    <style>
          div {
            width: 600px;
            height: 100px auto;
          }
          .message {
            display: inline-block;
            font-size: 12px;
            color: rgb(119, 113, 113);
            background: url(images/zjl.jpg) no-repeat left center;
            padding-left: 20px;
          }
          .wrong {
            color: red;
            background-image: url(images/zxc.jpg);
          }
          .right {
            color: green;
            background-image: url(images/zyl.jpg);
          }
        </style>
      </head>
      <body>
        <!--案例:用户如果离开密码框,里面输入的个数不是6-16,则提示错误信息,否则提示输入正确信息-->
        <div class="register">
          <input type="password" class="ipt" />
          <p class="message">请输入6~16位密码</p>
        </div>
        <script>
          var ipt = document.querySelector(".ipt");
          var message = document.querySelector(".message");
          ipt.onblur = function () {
            //根据表单里面值的长度 ipt.value.length判断
            if (ipt.value.length < 6 || ipt.value.length > 16) {
              message.className = "message wrong";
              message.innerHTML = "您输入的位数不对,要求6~16位";
            } else {
              message.className = "message right";
              message.innerHTML = "您输入的格式正确";
            }
          };
        </script>
      </body>
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值