web API (事件监听)

395 阅读2分钟

Web API (事件监听)

1.事件

事件:

是在编程时系统内发生的 动作 或者发生的事情, 比如用户在网页上 单击 一个按钮

①.事件监听:

就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 注册事件

语法:

 <script>
     // 元素.addEventListener('事件' , 要执行的函数)
    

    // click 鼠标单击
        btn1.addEventListener('click', function () {
            console.log('开始抽奖了');
        })

</script>

②. 事件监听三要素:

  • 事件源: 那个dom元素被事件触发了,要获取dom元素
  • 事件: 用什么方式触发,比如鼠标单击 click、鼠标经过 mouseover 等
  • 事件调用的函数: 要做什么事

1649146851393.png

③. 事件监听版本 (了解即可)

1649146908359.png

④. 事件类型

1649146979394.png

2.高阶函数

高阶函数 可以被简单理解为函数的高级应用,JavaScript 中函数可以被当成【值】来对待,基于这个特性实现函数的高级应用。

【值】就是 JavaScript 中的数据,如数值、字符串、布尔、对象等。

①. 函数表达式

1649147177228.png 函数表达式和普通函数并无本质上的区别:

  • 普通函数的声明与调用无顺序限制,推荐做法先声明再调用
  • 函数表达式必须要先声明再调用
  • 高阶函数可以被简单理解为函数的高级应用,JavaScript 中函数可以被当成【值】来对待,基于这个特性实现函数的高级应用。
  • 【值】就是 JavaScript 中的数据,如数值、字符串、布尔、对象等。

②. 回调函数

  • 如果将函数 A 做为参数传递给函数 B 时,我们称函数 A 为回调函数
  • 简单理解: 当一个函数当做参数来传递给另外一个函数的时候,这个函数就是回调函数

1649252427811.png

3.环境对象

环境对象指的是函数内部特殊的 变量 this ,它代表着当前函数运行时所处的环境

作用:弄清楚this的指向,可以让我们代码更简洁

​ 》 函数的调用方式不同,this 指代的对象也不同

​ 》 【谁调用, this 就是谁】 是判断 this 指向的粗略规则

​ 》 直接调用函数,其实相当于是 window.函数,所以 this 指代 window

语法:

<!DOCTYPE html>
<html lang="zh-CN">
  <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>
      .erweima {
        position: relative;

        width: 160px;
        height: 160px;

        margin: 100px auto;
      }

      span {
        position: absolute;
        left: -20px;
        top: 0;

        display: block;
        width: 20px;
        text-align: center;
        border: 1px solid #ccc;

        /* 鼠标效果 */
        cursor: pointer;
      }
    </style>
  </head>

  <body>
    <div class="erweima">
      <img src="images/01.png" alt="" />
      <span class="s1"> X1 </span>
    </div>
    <div class="erweima">
      <img src="images/01.png" alt="" />
      <span class="s1"> X2 </span>
    </div>
    <div class="erweima">
      <img src="images/01.png" alt="" />
      <span class="s1"> X3 </span>
    </div>
    <div class="erweima">
      <img src="images/01.png" alt="" />
      <span class="s1"> X4 </span>
    </div>
    
    <script>
      
      let spans = document.querySelectorAll('span')

       for (let i = 0; i < spans.length; i++) {
           spans[i].addEventListener('click', function () {
               // 单个使用 不好体现this作用
               this.parentNode.style.display = 'none'
           })
           
       }
    </script>
  </body>
</html>

4.字符串长度

  • 类似数组的特性
  • 属性 length 当前字符串的长度
  • 字符串也可以通过下标来访问 :( let i = 'abc' i[1] = b )
  • 字符串也可以遍历 ( 'abc' 遍历 a b c ( log 一下 它们就会一个一个往下排了 ) )
<!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>
  <link rel="stylesheet" href="css/weibo.css" />
</head>

<body>
  <div class="w">
    <div class="controls">
      <img src="images/tip.png" alt="" /><br />
      <textarea placeholder="说点什么吧..." id="area" cols="30" rows="10" maxlength="200"></textarea>
      <div>
        <span class="useCount">0</span>
        <span>/</span>
        <span>200</span>
        <button id="send">发布</button>
      </div>
    </div>
    <div class="contentList">
      <ul></ul>
    </div>
  </div>
  <script>
    
    let area = document.querySelector('#area')
    let useCount = document.querySelector('.useCount')

    //  用户输入文字,可以计算用户输入的字数: input 
    area.addEventListener('input', function () {
      
      // console.log(area.value);
      //  属性 length 当前字符串的长度
      useCount.innerHTML = area.value.length
    })
  </script>
</body>

</html>

5.编程思想

①.排他思想

  • 干掉所有人 之后使用for 循环
  • 复活他自己 通过this 或者下标照照自己或者对应的元素
  • 语法:
<!DOCTYPE html>
<html>
  <head lang="en">
    <meta charset="UTF-8" />
    <title></title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }

      ul {
        list-style: none;
      }

      .wrapper {
        width: 1000px;
        height: 475px;
        margin: 0 auto;
        margin-top: 100px;
      }

      .tab {
        border: 1px solid #ddd;
        border-bottom: 0;
        height: 36px;
        width: 320px;
      }

      .tab li {
        position: relative;
        float: left;
        width: 80px;
        height: 34px;
        line-height: 34px;
        text-align: center;
        cursor: pointer;
        border-top: 4px solid #fff;
      }

      .tab span {
        position: absolute;
        right: 0;
        top: 10px;
        background: #ddd;
        width: 1px;
        height: 14px;
        overflow: hidden;
      }

      .products {
        width: 1002px;
        border: 1px solid #ddd;
        height: 476px;
      }

      .products .main {
        float: left;
        display: none;
      }

      .products .main.active {
        display: block;
      }

      .tab li.active {
        border-color: red;
        border-bottom: 0;
      }
    </style>
  </head>

  <body>
    <div class="wrapper">
      <ul class="tab">
        <li class="tab-item active">国际大牌<span></span></li>
        <li class="tab-item">国妆名牌<span></span></li>
        <li class="tab-item">清洁用品<span></span></li>
        <li class="tab-item">男士精品</li>
      </ul>
      <div class="products">
        <div class="main active">
          <a href="###"><img src="imgs/guojidapai.jpg" alt="" /></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/guozhuangmingpin.jpg" alt="" /></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/qingjieyongpin.jpg" alt="" /></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/nanshijingpin.jpg" alt="" /></a>
        </div>
      </div>
    </div>

    <script>
      /* 
      1 给标题标签 给他们绑定点击事件
      2 事件触发 开始使用排他思想
        1 获取所有的要设置标题样式的标签  遍历他们,移除掉 上边框 红色效果
        2 通过 this  给自己单独添加上 上边框红色的效果 

        3 获取到所有的main标签(决定图片显示)  遍历他们 移除掉 一个class active
        4 再获取到要设置的 main标签 让它 添加上一个class active

      
       */

      let liList = document.querySelectorAll('li');
      let mainList = document.querySelectorAll('.main');

      for (let index = 0; index < liList.length; index++) {
        liList[index].addEventListener('click', function () {
          // 遍历li标签 移除他们身上的类 active
          for (let j = 0; j < liList.length; j++) {
            liList[j].classList.remove('active');
          }
          // 单独对我自己 添加一个类
          this.classList.add('active'); // this = li标签 

          // 处理图片显示部分

          // 先遍历所有的main标签 让他们移除掉 active
          for (let j = 0; j < mainList.length; j++) {
            mainList[j].classList.remove('active');
          }

          // 设置给对应的标签 添加上 active
          // 单独对我自己 添加一个类
          // mainList[index] // index 就是和被点击li标签的下标 
          mainList[index].classList.add('active');
        });
      }
    </script>
  </body>
</html>