zoukankan      html  css  js  c++  java
  • 前端入门笔js篇之DOM(2)

    一.节点

    1.概述

    (1)概念

    网页中的所有内容都是节点(标签,属性,文本,注释等),一般的节点至少要拥有nodeType(类型),nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

    (2)分类

    元素节点 nodeType 为1

    属性节点 nodeType 为2

    文本节点 nodeType 为3(包含,文字,空格,换行等)

    (3)层级关系

    分为父兄子层级

    2.获取节点

    (1)获取父级节点

    element.parentNode
    //得到的是离元素最近的父级节点,如果找不到父节点就返回为 null。
    

    demo

    <body>
        <div class="demo">
            <div class="box">
                <span class="erweima">×</span>
            </div>
        </div>
        <script>
             //1.用获取元素的方法
            // var box = document.querySelector('.box');
            // 2.用获取父级节点的方法
            //先获取子节点,在根据子节点获取父级节点
            var erweima = document.querySelector('.erweima');
            console.log(erweima.parentNode);   //输出 <div class="box"></div>
        </script>
    </body>
    

    (2)获取子节点

    方法一

    element.childNodes
    //返回所有的子节点包含元素节点,文本节点等
    

    demo

    <body>
        <!-- 节点的优点 -->
        <div>我是div</div>
        <span>我是span</span>
        <ul>
            <li>我是li</li>
            <li>我是li</li>
            <li>我是li</li>
            <li>我是li</li>
        </ul>
        <script>
            var ul = document.querySelector('ul');
              // 方法一:用获取元素的方法获取(只能获取li)
            var lis = ul.querySelectorAll('li');
            console.log(lis[0].nodeType)  //第一个节点为元素节点(li),所以输出1
            // 方法二: 用获取节点的方法获取(所有的子节点 包含 元素节点 文本节点等)
            console.log(ul.childNodes[0].nodeType);  //第一个节点为文本节点(空格),所以输出3
        </script>
    </body>
    

    方法二

    element.children
    获取所有的子元素节点
    

    demo

    <body>
        <div>我是div</div>
        <span>我是span</span>
        <ul>
            <li>我是li</li>
            <li>我是li</li>
            <li>我是li</li>
            <li>我是li</li>
        </ul>
        <script>
            var ul = document.querySelector('ul');
            //children 获取所有的子元素节点
            console.log(ul.children[0].nodeType);     //输出1
        </script>
    </body>
    

    (3)返回第一个和最后一个子节点

    方法一

    element.firstChild 和  element.lastChild
    //返回第一个和最后一个子节点,不管是文本节点还是元素节点
    

    demo

    <body>
        <ol>
            <li>我是li1</li>
            <li>我是li2</li>
            <li>我是li3</li>
            <li>我是li4</li>
            <li>我是li5</li>
        </ol>
        <script>
            var ol = document.querySelector('ol');
            console.log(ol.firstChild.nodeType); //输出第一个节点,为文本节点(空格)
            console.log(ol.lastChild.nodeType);//输出第一个节点,为文本节点(空格)
        </script>
    </body>
    

    方法二

    element.firstElementChild 和 element.lastElementChild
    // 返回第一个和最后一个子元素节点 ie9才支持
    

    demo

    <body>
        <ol>
            <li>我是li1</li>
            <li>我是li2</li>
            <li>我是li3</li>
            <li>我是li4</li>
            <li>我是li5</li>
        </ol>
        <script>
            var ol = document.querySelector('ol');
            // 2. firstElementChild 返回第一个子元素节点 ie9才支持
            console.log(ol.firstElementChild);
            console.log(ol.lastElementChild);
            // 3. 实际开发的写法  既没有兼容性问题又返回第一个子元素
            console.log(ol.children[0]);
            console.log(ol.children[ol.children.length - 1]);
        </script>
    </body>
    

    方法三 —— 兼容写法

    <body>
        <ol>
            <li>我是li1</li>
            <li>我是li2</li>
            <li>我是li3</li>
            <li>我是li4</li>
            <li>我是li5</li>
        </ol>
        <script>
            var ol = document.querySelector('ol');
            // 既没有兼容性问题又返回第一个和最后一个子元素
            console.log(ol.children[0]);
            console.log(ol.children[ol.children.length - 1]);
        </script>
    </body>
    

    综合demo——下拉菜单

    <head>
        <!-- 样式部分 -->
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            
            li {
                list-style-type: none;
            }
            
            a {
                text-decoration: none;
                font-size: 14px;
            }
            
            .nav {
                margin: 100px;
            }
            
            .nav>li {
                position: relative;
                float: left;
                 80px;
                height: 41px;
                text-align: center;
            }
            
            .nav li a {
                display: block;
                 100%;
                height: 100%;
                line-height: 41px;
                color: #333;
            }
            
            .nav>li>a:hover {
                background-color: #eee;
            }
            
            .nav ul {
                display: none;
                position: absolute;
                top: 41px;
                left: 0;
                 100%;
                border-left: 1px solid #FECC5B;
                border-right: 1px solid #FECC5B;
            }
            
            .nav ul li {
                border-bottom: 1px solid #FECC5B;
            }
            
            .nav ul li a:hover {
                background-color: #FFF5DA;
            }
        </style>
    </head>
    <body>
        <!-- 结构部分 -->
        <ul class="nav">
            <li>
                <a href="#">微博1</a>
                <ul>
                    <li>
                        <a href="">私信</a>
                    </li>
                    <li>
                        <a href="">评论</a>
                    </li>
                    <li>
                        <a href="">@我</a>
                    </li>
                </ul>
            </li>
            <li>
                <a href="#">微博2</a>
                <ul>
                    <li>
                        <a href="">私信</a>
                    </li>
                    <li>
                        <a href="">评论</a>
                    </li>
                    <li>
                        <a href="">@我</a>
                    </li>
                </ul>
            </li>
        </ul>
        <!-- js部分 -->
        <script>
            // 1. 获取元素
            var nav = document.querySelector('.nav');
            var lis = nav.children; // 得到4个小li
            // 2.循环注册事件
            for (var i = 0; i < lis.length; i++) {
                lis[i].onmouseover = function() {
                    this.children[1].style.display = 'block';
                }
                lis[i].onmouseout = function() {
                    this.children[1].style.display = 'none';
                }
            }
        </script>
    </body>
    

    (4)获取兄弟节点

    方法一

    element.nextSibling
    //获取下一个兄弟节点,包含元素节点或者文本节点等等
    

    方法二

    element.previousSibling
    //获取上一个兄弟节点 包含元素节点或者文本节点等
    

    demo

    <body>
        <div>我是div</div>
        <span>我是span</span>
        <script>
            var div = document.querySelector('div');
            console.log(div.nextSibling);    //输出下一个兄弟节点(空格)
            console.log(div.previousSibling); //输出上一个兄弟节点(空格)
        </script>
    </body>
    

    方法三

    element. nextElementSibling
    // 得到下一个兄弟元素节点
    

    方法四

    element.previousElementSibling
    //得到上一个兄弟元素节点
    

    demo

    <body>
        <div>我是div</div>
        <span>我是span</span>
        <script>
            var div = document.querySelector('div');
            console.log(div.nextElementSibling);             //输出下一个兄弟元素节点(span元素)
            console.log(div.previousElementSibling);     //输出上一个兄弟节点(没有上一个兄弟节点,输出nul)
        </script>
    </body>
    

    3.创建和插入节点

    (1)创建节点元素节点

    document.createElement('元素名');
    

    demo

    var li = document.createElement('li');
    

    注:

    创建之后需要插入或者说是添加到其他地方,否则创建的元素就没有任何意义。

    (2)插入节点

    将一个节点添加到指定父节点的子节点列表末尾。类似于css的after伪元素。

    node.appendChild(achild)
    // node :是父级  
    //child :是要添加的元素
    

    将一个节点添加到父级节点的指定节点前面,类似于css的before。

    node.insertBefore(child, 指定元素)
    //node: 父级元素
    //child: 是要插入的节点
    //指定元素:是在某个元素前面插入
    

    demo

    <body>
        <ul>
            <li>123</li>
        </ul>
        <script>
            // 创建节点元素节点
            var li1 = document.createElement('li');
            // 获取父级节点
            var ul = document.querySelector('ul'); 
            //  添加节点 node.appendChild(child) 
            ul.appendChild(li1);
            //  添加节点 node.insertBefore(child, 指定元素);
            var li2 = document.createElement('li');
            ul.insertBefore(li2, ul.children[0]);
        </script>
    </body>
    

    demo——简化版留言板

    <!DOCTYPE html>
    <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Document</title>
          <style>
              * {
                  margin: 0;
                  padding: 0;
              }
              body {
                  padding: 100px;
              } 
              textarea {
                   200px;
                  height: 100px;
                  border: 1px solid pink;
                  outline: none;
                  resize: none;
              }    
              ul {
                  margin-top: 50px;
              }     
              li {
                   300px;
                  padding: 5px;
                  background-color: rgb(245, 209, 243);
                  color: red;
                  font-size: 14px;
                  margin: 15px 0;
              }
          </style>
      </head>
      <body>
          <textarea name="" id=""></textarea>
          <button>发布</button>
          <ul>
          </ul>
          <script>
              // 1. 获取元素
              var btn = document.querySelector('button');
              var text = document.querySelector('textarea');
              var ul = document.querySelector('ul');
              // 2. 注册事件
              btn.onclick = function() {
                  if (text.value == '') {
                      alert('您没有输入内容');
                      return false;
                  } else {
                      // console.log(text.value);
                      // (1) 创建元素
                      var li = document.createElement('li');
                      // 给li赋值
                      li.innerHTML = text.value;
                      // (2) 添加元素
                      ul.insertBefore(li, ul.children[0]);
                  }
              }
          </script>
      </body>
    </html>
    

    4.删除节点

    删除父级节点里面的某一个子节点

    node.removeChild(child)
    //node :父级节点
    //child : 指定删除的节点
    

    demo

    <body>
        <button>删除</button>
        <ul>
            <li>熊大</li>
            <li>熊二</li>
            <li>光头强</li>
        </ul>
        <script>
            //获取元素
            var ul = document.querySelector('ul');
            var btn = document.querySelector('button');
            // 点击按钮依次删除里面的ul里面的子节点li
            btn.onclick = function() {
              //如果父级节点没有子节点了,那么就禁用删除按钮
                if (ul.children.length == 0) {
                    this.disabled = true;
                } else {
                    ul.removeChild(ul.children[0]);
                }
            }
        </script>
    </body>
    

    5.复制节点

    node.cloneNode()
    //node: 是要复制的节点
    

    括号为空或者里面是false 浅拷贝 只复制标签不复制里面的内容

    node.cloneNode(true)
    

    括号为true 深拷贝 复制标签复制里面的内容

    demo

    <body>
        <ul>
            <li>1111</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <script>
            var ul = document.querySelector('ul');
            var lili = ul.children[0].cloneNode(true);  //复制ul里面的第一个子元素
            ul.appendChild(lili);        //在ul里最后一个li后面添加复制的li
        </script>
    </body>
    

    6.动态生成表格案例

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            table {
                 500px;
                margin: 100px auto;
                border-collapse: collapse;
                text-align: center;
            }
            td,
            th {
                border: 1px solid #333;
            }
            
            thead tr {
                height: 40px;
                background-color: #ccc;
            }
        </style>
    </head>
    
    <body>
        <table cellspacing="0">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>科目</th>
                    <th>成绩</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
    
            </tbody>
        </table>
        <script>
            // 1.先去准备好学生的数据
            var datas = [{
                name: '小一',
                subject: 'JavaScript',
                score: 100
            }, {
                name: '小二',
                subject: 'JavaScript',
                score: 98
            }, {
                name: '小三',
                subject: 'JavaScript',
                score: 99
            }, {
                name: '小四',
                subject: 'JavaScript',
                score: 88
            }, {
                name: '小五',
                subject: 'JavaScript',
                score: 0
            }];
            // 2. 往tbody 里面创建行: 有几个人就创建几行
            var tbody = document.querySelector('tbody');
            for (var i = 0; i < datas.length; i++) { 
                // 1. 创建 tr行
                var tr = document.createElement('tr');
                tbody.appendChild(tr);
                // 2. 行里面创建单元格
                for (var k in datas[i]) {
                    // 创建单元格 
                    var td = document.createElement('td');
                    // 把对象里面的属性值 datas[i][k] 给 td  
                    td.innerHTML = datas[i][k];
                    tr.appendChild(td);
                }
                // 3. 创建有删除2个字的单元格 
                var td = document.createElement('td');
                td.innerHTML = '<a href="javascript:;">删除 </a>';
                tr.appendChild(td);
    
            }
            // 4. 删除操作 
            var as = document.querySelectorAll('a');
            for (var i = 0; i < as.length; i++) {
                as[i].onclick = function() {
                    // 点击a 删除 当前a 所在的行 
                    tbody.removeChild(this.parentNode.parentNode)
                }
            }
           
        </script>
    </body>
    </html>
    

    二.事件

    1.注册事件

    (1)传统事件

    缺点:

    具有唯一性,同一个事件只能设置一个处理函数,如果设置多个,后面的函数会覆盖前面的函数。

    <body>
        <button>传统注册事件</button>
        <script>
            var btns = document.querySelector('button');
            btns.onclick = function() {
                alert('hello word');
            }
        </script>
    </body>
    

    (2)方法监听事件

    element.addEventListener(type, function, useCapture)
    

    注:

    type为事件类型,为字符串 ,比如’click‘,'mouseover'在这里不带on。

    function,事件处理函数,同一个元素 同一个事件可以添加多个侦听器(事件处理程序)

    useCapture,可选。值为布尔值(true和false),指定事件是否在捕获或冒泡阶段执行,默认为冒泡事件(false)

    <body>
        <button>方法监听注册事件</button>
        <script>
            var btns = document.querySelector('button')
            btns.addEventListener('click', function() {
                    alert('方法监听事件1');
                })
                //同一个事件绑定多个事件函数,两个事件函数都能执行
            btns.addEventListener('click', function() {
                alert("方法监听事件2");
            })
        </script>
    </body>
    

    2.删除(解绑)事件

    (1)传统删除事件

    <body>
        <div>1</div>
        <script>
            var div = document.querySelector('div');
            div.onclick = function() {
                    alert(11);
                    div.onclick = null;   //// 传统方式删除事件,弹出一次之后就不会在弹出
                }
        </script>
    

    (2) 删除事件

    element.removeEventListener('type',fun_name)
    //type : 要删除的数据类型
    //fun_name : 要删除的函数名
    
    <body>
        <div>1</div>
        <script>
            var div = document.querySelector('div');
            //. removeEventListener 删除事件
            div.addEventListener('click', fn) // 里面的fn 不需要调用加小括号
          //定义函数
            function fn() {
                alert(22);
                div.removeEventListener('click', fn);
            }
        </script>
    </body>
    

    3.DOM事件流

    (1)概念

    事件流描述的是从页面中接收事件的顺序。事件发生时会在元素之间按照特定的顺序传播,这个传播过程即为DOM事件流。

    (2)阶段

    1.捕获阶段
    
    2.当前目标阶段
    
    3.冒泡阶段
    

    给一个div,注册事件

    注:

    1. JS 代码中<u>只能执行捕获,冒泡其中的一个阶段</u>。
    
    2. onclick 和 attachEvent(ie) 只能得到冒泡阶段。
    
     3. 捕获阶段 如果addEventListener 第三个参数是 true 那么则处于捕获阶段 document  ——> html ——> body ——> father ——> son
    
    <style>
            .father {
                overflow: hidden;
                 300px;
                height: 300px;
                margin: 100px auto;
                background-color: pink;
                text-align: center;
            }
            .son {
                 200px;
                height: 200px;
                margin: 50px;
                background-color: purple;
                line-height: 200px;
                color: #fff;
            }
    </style>
    <body>
        <div class="father">
            <div class="son">son盒子</div>
        </div>
        <script>
             var son = document.querySelector('.son');
            son.addEventListener('click', function() {
                alert('son');
            }, true);        //设置为true
            var father = document.querySelector('.father');
            father.addEventListener('click', function() {
                alert('father');
            }, true);
        </script>
    </body>
    

    1. 冒泡阶段 如果addEventListener 第三个参数是 false 或者 省略 那么则处于冒泡阶段 son -> father ->body -> html -> document
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            .father {
                overflow: hidden;
                 300px;
                height: 300px;
                margin: 100px auto;
                background-color: pink;
                text-align: center;
            } 
            .son {
                 200px;
                height: 200px;
                margin: 50px;
                background-color: purple;
                line-height: 200px;
                color: #fff;
            }
        </style>
    </head>
    <body>
        <div class="father">
            <div class="son">son盒子</div>
        </div>
    <script>
            var son = document.querySelector('.son');
            son.addEventListener('click', function() {
                alert('son');           
            }, false);
            document.addEventListener('click', function() {
                alert('document');
            })
      //先弹出son,在弹出document
        </script>
    </body>
    

    4.事件对象

    (1)概念

    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            div {
                 100px;
                height: 100px;
                background-color: pink;
            }
        </style>
    </head>
    <body>
        <div>123</div>
        <script>
            // 事件对象
            var div = document.querySelector('div');
            div.onclick = function(event) {
                    console.log(event);
                }    
        </script>
    </body>
    

    注:

    1. event 就是一个事件对象 写到我们侦听函数的 小括号里面 当形参来看
    2. 事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
    3. 事件对象 是 我们事件的一系列相关数据的集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信息,比如鼠标坐标,如果是键盘事件里面就包含的键盘事件的信息 比如 判断用户按下了那个键
    4. 这个事件对象我们可以自己命名 比如 event 、 evt、 e
    5. 事件对象也有兼容性问题 ie678 通过 window.event 兼容性的写法 e = e || window.event;

    (2)常见事件对象的属性和方法

    属性方法 说明
    e.target 返回触发事件的对象(标准)
    e.srcElement 返回触发事件的对象(低版本浏览器使用)
    e.type 返回事件的类型,比如click,mouseover等
    e.cancelBubble 该属性阻止冒泡(低版本浏览器使用)
    e.stopPropagation() 阻止冒泡事件
    e.returnValue 该属性阻止默认事件(默认行为,比如跳转,低版本浏览器使用)
    e.prevenDefault() 该属性阻止默认事件

    e.target 和this的区别

    1. e.target 返回的是触发事件的对象(元素)

    2. this 返回的是绑定事件的对象(元素)

    <body>
        <ul>
            <li>abc</li>
            <li>abc</li>
            <li>abc</li>
        </ul>
        <script>
            var ul = document.querySelector('ul');
            ul.addEventListener('click', function(e) {
                    // ul绑定了事件  那么this 就指向ul  
                    console.log(this);     //输出<ul>....<ul>
                    // e.target 指向我们点击的那个对象  我们点击的是li, e.target 指向的就是li
                    console.log(e.target);      //输出<li>abc<li>
                }) 
        </script>
    </body>
    
    

    demo——阻止默认事件

    <body>
        <a href="http://www.baidu.com">百度</a>
        <script>
            // 阻止默认行为(事件) 让链接不跳转 或者让提交按钮不提交
            var a = document.querySelector('a');
            a.addEventListener('click', function(e) {
                    e.preventDefault(); //  dom 标准写法
                })
        </script>
    </body>
    

    demo——返回事件的类型

    <body>
        <div>123</div>
         <script>
              var div = document.querySelector('div');
              div.addEventListener('click', fn);
              div.addEventListener('mouseover', fn);
              div.addEventListener('mouseout', fn);
                  //1. 返回事件类型
            function fn(e) {
                  console.log(e.type);
              }
         </script>
    </body>
    

    demo——阻止事件冒泡

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <head>
        <style>
            .father {
                overflow: hidden;
                 300px;
                height: 300px;
                margin: 100px auto;
                background-color: pink;
                text-align: center;
            }
    
            .son {
                 200px;
                height: 200px;
                margin: 50px;
                background-color: purple;
                line-height: 200px;
                color: #fff;
            }
        </style>
    </head>
    
    <body>
        <div class="father">
            <div class="son">son儿子</div>
        </div>
        <script>
            // 阻止冒泡  dom 推荐的标准 stopPropagation() 
            var son = document.querySelector('.son');
           
            son.addEventListener('click', function (e) {
                alert('son');
                e.stopPropagation(); })// stop 停止  Propagation 传播
               
                // //下面的不会弹出
                var father = document.querySelector('.father');
                father.addEventListener('click', function () {
                    alert('father');
                });
    
                document.addEventListener('click', function () {
                    alert('document');
                })
        </script>
    </body>
    </html>
    

    (3)事件委托

    事件委派也称为事件代理,在jquery里面称为事件委派。

    原理

    不给每个子节点单独设置事件监听器,而是将事件监听器设置在父级节点上,通过子节点来触发父级身上的监听器,达到把监听器设置在子节点上一样效果。

    5.鼠标事件

    (1)常见鼠标事件

    事件 条件
    onclick 鼠标左键触发
    onmouseover 鼠标经过触发
    onmouseout 鼠标离开
    onfocus 获取鼠标焦点触发
    onblur 鼠标失去焦点触发
    onmousemove 鼠标移动触发
    onmouseup 鼠标弹起触发
    onmousedown 鼠标按下触发

    demo

    <body>
        我是一段不愿意分享的文字
        <script>
            // 1. contextmenu 我们可以禁用右键菜单
            document.addEventListener('contextmenu', function(e) {
                    e.preventDefault();
                })
                // 2. 禁止选中文字 selectstart
            document.addEventListener('selectstart', function(e) {
                e.preventDefault();
    
            })
        </script>
    </body>
    

    (2)常见鼠标对象

    鼠标事件对象 说明
    e.clientX 返回鼠标相对于浏览器窗口可视区的X坐标
    e.lientY 返回鼠标相对于浏览器窗口可视区的Y坐标
    e.pageX 返回鼠标相对于文档页面的X坐标
    e.pageY 返回鼠标相对于文档页面的Y坐标
    e.screenX 返回鼠标相对于电脑屏幕的X坐标
    e.screenY 返回鼠标相对于电脑屏幕的Y坐标

    demo

    <body>
        <script>
            // 鼠标事件对象 MouseEvent
            document.addEventListener('click', function(e) {
                // 1. client 鼠标在可视区的x和y坐标
                console.log(e.clientX);
                console.log(e.clientY);
                console.log('---------------------');
    
                // 2. page 鼠标在页面文档的x和y坐标
                console.log(e.pageX);
                console.log(e.pageY);
                console.log('---------------------');
    
                // 3. screen 鼠标在电脑屏幕的x和y坐标
                console.log(e.screenX);
                console.log(e.screenY);
    
            })
        </script>
    </body>
    

    demo——跟随鼠标移动的图片

    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            img {
                position: absolute;
                top: 2px;
            }
        </style>
    </head>
    <body>
        <img src="images/angel.gif" alt="">
        <script>
            var pic = document.querySelector('img');
            document.addEventListener('mousemove', function(e) {
                // 1. mousemove只要我们鼠标移动1px 就会触发这个事件
                // console.log(1);
                // 2.核心原理: 每次鼠标移动,我们都会获得最新的鼠标坐标, 把这个x和y坐标做为图片的top和left 值就可以移动图片
                var x = e.pageX;
                var y = e.pageY;
                console.log('x坐标是' + x, 'y坐标是' + y);
                //3 . 千万不要忘记给left 和top 添加px 单位
                pic.style.left = x - 50 + 'px';
                pic.style.top = y - 40 + 'px';
            });
        </script>
    </body>
    

    6.键盘事件

    (1)常见键盘事件

    事件 触发条件
    onkeyup 某个键盘按键被松开时触发
    onkeydown 某个键盘按键被按下时触发
    nokeypress 某个键盘按键被按下时触发,但是不识别功能键,比如,ctrl,shift,箭头等

    demo

     <script>
            // keyup 按键弹起的时候触发 
            document.addEventListener('keyup', function() {
                console.log('我弹起了');
            })
    
            //. keypress 按键按下的时候触发  
            document.addEventListener('keypress', function() {
                    console.log('我按下了press');
                })
                //2. keydown 按键按下的时候触发  能识别功能键 比如 ctrl shift 左右箭头啊
            document.addEventListener('keydown', function() {
                    console.log('我按下了down');
                })
                //  三个事件的执行顺序  keydown -- keypress -- keyup
    </script>
    

    (2)键盘事件对象

    事件对象 描述
    keycode 返回按下的按键的ASCLL值
    <body>
        <script>
            // 1. 我们的keyup 和keydown事件不区分字母大小写  a 和 A 得到的都是65
            // 2. 我们的keypress 事件 区分字母大小写  a  97 和 A 得到的是65
            document.addEventListener('keyup', function(e) {
                console.log('up:' + e.keyCode);
                // 我们可以利用keycode返回的ASCII码值来判断用户按下了那个键
                if (e.keyCode === 65) {
                    alert('您按下的a键');
                } else {
                    alert('您没有按下a键')
                }
    
            })
            document.addEventListener('keypress', function(e) {
                // console.log(e);
                console.log('press:' + e.keyCode);
    
            })
        </script>
    </body>
    

    demo——仿京东快递查询

    效果: 快递单号输入内容时, 在上面显示更大的字体,提高用户体验

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            
            .search {
                position: relative;
                 178px;
                margin: 100px;
            }
            
            .con {
                display: none;
                position: absolute;
                top: -40px;
                 171px;
                border: 1px solid rgba(0, 0, 0, .2);
                box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
                padding: 5px 0;
                font-size: 18px;
                line-height: 20px;
                color: #333;
            }     
            .con::before {
                content: '';
                 0;
                height: 0;
                position: absolute;
                top: 28px;
                left: 18px;
                border: 8px solid #000;
                border-style: solid dashed dashed;
                border-color: #fff transparent transparent;
            }
        </style>
    </head>
    <body>
        <div class="search">
            <div class="con">123</div>
            <input type="text" placeholder="请输入您的快递单号" class="jd">
        </div>
        <script>
            // 快递单号输入内容时, 上面的大号字体盒子(con)显示(这里面的字号更大)
            // 表单检测用户输入: 给表单添加键盘事件
            // 同时把快递单号里面的值(value)获取过来赋值给 con盒子(innerText)做为内容
            // 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子
            var con = document.querySelector('.con');
            var jd_input = document.querySelector('.jd');
            jd_input.addEventListener('keyup', function() {
                    // console.log('输入内容啦');
                    if (this.value == '') {
                        con.style.display = 'none';
                    } else {
                        con.style.display = 'block';
                        con.innerText = this.value;
                    }
                })
                // 当我们失去焦点,就隐藏这个con盒子
            jd_input.addEventListener('blur', function() {
                    con.style.display = 'none';
                })
                // 当我们获得焦点,就显示这个con盒子
            jd_input.addEventListener('focus', function() {
                if (this.value !== '') {
                    con.style.display = 'block';
                }
            })
        </script>
    </body>
    

  • 相关阅读:
    LeetCode 842. Split Array into Fibonacci Sequence
    LeetCode 1087. Brace Expansion
    LeetCode 1219. Path with Maximum Gold
    LeetCode 1079. Letter Tile Possibilities
    LeetCode 1049. Last Stone Weight II
    LeetCode 1046. Last Stone Weight
    LeetCode 1139. Largest 1-Bordered Square
    LeetCode 764. Largest Plus Sign
    LeetCode 1105. Filling Bookcase Shelves
    LeetCode 1027. Longest Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/lc-snail/p/13182012.html
Copyright © 2011-2022 走看看