webApi第五天

106 阅读3分钟

webApi第五天

const

const声明的变量 不可以被修改 是常量

声明变量能使用const的话 就不要使用let

事件对象

也是对象,这个对象里事件出发时的相关信息

例如:鼠标点击事件中,事件对象就存了鼠标点在哪个位置等信息

在事件绑定的回调函数的第一个参数就是事件对象 一般命名为event、ev、e

语法:

元素.addEventListener('click',function (event) {}

常见属性

鼠标坐标信息

clientX/clientY

获取光标相对于浏览器可见窗口左上角的位置

offsetX/offsetY 获取光标相对于当前DOM元素左上角的位置

<body>
    <button>点击点击</button>
    <script>
      // 获取按钮
      const btn = document.querySelector('button');

      btn.addEventListener('click', function (event) {
        console.log(event); // 存放事件触发一瞬间的信息 -  鼠标位置信息  事件对象一般命名为event、ev、e
      });
    </script>
</body>

键盘按下信息

key 用户按下的键盘键的值 现在不提倡使用keyCode

事件流

事件流值得是事件完整执行过程中的流动路径

事件流动的两个阶段

1.捕获阶段

从DOM的根元素开始去执行对应的事件 (从外到里)。

事件捕获需要写对应代码才能看到效果。

说明:

addEventListener第三个参数传入true代表是捕获阶段触发(很少使用)。

若传入false代表冒泡阶段触发,默认就是false

若是用 L0 事件监听,则只有冒泡阶段,没有捕获

addEventListener("click",function(){},true), 谁加了 true,那他的点击事件会优先触发

2.冒泡阶段

当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。这一过程被称为事件冒泡 简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的同名事件 事件冒泡是默认存在的

阻止冒泡

在事件对象中 event 找到一个方法 停止冒泡 event.stopPropagation();

1.因为默认就有冒泡模式的存在,所以容易导致事件影响到父级元素。

2.若想把事件就限制在当前元素内,就需要阻止事件流动。

3.阻止事件流动需要拿到事件对象。

4.此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效。

阻止标签默认行为

阻止标签默认行为,如阻止a标签点击跳转行为

清除表单和超链接跳转默认样式示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>阻止标签的默认行为.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <a href="http://www.baidu.com">百度</a>

    <form >
      <!-- <button type="button">点击我 就会自动刷新</button> -->
      <!-- <input type="button" value="点击我"> -->
    </form>
    <button>刷新</button>
    <script>
      /* 
      1 a标签的点击跳转
      2 form表单中button点击刷新行为
        1 阻止默认行为 - form表单 有一个 submit 事件 理解提交表单的触发-点击按钮的时候触发
        2 给button按钮绑定点击事件 也去阻止试试
        3 给button按钮 添加一个 type="button" 属性 
        4 换成 input标签 type="button"
        5 把button 移出form表单的区域 

      使用新技术 阻止标签默认行为 
       */
      const a=document.querySelector("a");
      const form=document.querySelector("form");
      const button=document.querySelector("button");
      a.addEventListener("click",function (event) {
        console.log("a标签的点击触发啦");
        // 阻止a标签的默认行为,让他不要跳转
        event.preventDefault();
      })

      // form.addEventListener("submit",function (event) {
      //   // 不要让页面再刷新
      //   event.preventDefault();
      // })

      // button.addEventListener("click",function (event) {
      //   event.preventDefault();  // 不要让页面再刷新
      // })
    </script>
  </body>
</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>
    <style>
        * {
          margin: 0;
          padding: 0;
          box-sizing: border-box;
        }
        body {
          height: 100vh;
        }
        .menu {
          list-style: none;
          padding: 10px;
          border-radius: 5px;
          border: 1px solid #ccc;
          width: 150px;
          position: fixed;
  
          display: none;
        }
        li {
          height: 40px;
          display: flex;
          align-items: center;
          padding-left: 10px;
          border-bottom: 1px solid #ccc;
        }
        li:hover {
          background-color: #999;
          color: #fff;
          cursor: pointer;
        }
        li:last-child {
          border-bottom: none;
        }
      </style>
</head>
<body>
    <ul class="menu">
        <li>添加图标</li>
        <li>切换壁纸</li>
        <li>下载壁纸</li>
        <li>设置</li>
    </ul>

    <script>
        const menu = document.querySelector('.menu')

        //给页面标签绑定鼠标右键点击事件
        document.body.addEventListener('contextmenu',function (event) {
            //获取鼠标右键点击时的坐标
            const left = event.clientX            
            const top = event.clientY  
            
            menu.style.left = left + 'px'
            menu.style.top = top + 'px'
            menu.style.display = 'block'

          //清除鼠标右键点击默认样式  
            event.preventDefault()
        })

        document.body.addEventListener('click',function () {
            menu.style.display = 'none'
        })
    </script>
</body>
</html>

事件委托

**事件委托 **是利用事件流的特征解决一些开发需求的知识技巧。

总结:

优点:给父级元素加事件(可以提高性能)。

原理:事件委托其实是利用事件冒泡的特点, 给父元素添加事件,子元素可以触发。

实现:事件对象.target 可以获得真正触发事件的元素。

1650556487919.png