JavaScript第二天(事件监听)

第二天(事件监听)

目标:能够给DOM元素添加 事件监听

语法:

元素.addEventListener('事件',要执行的函数)
复制代码

什么是事件?

​ 事件是在编程时系统内发生的动作或者发生的事情

​ 比如点击按钮 click

什么是事件监听?

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

事件监听三要素是什么?

​ 事件源 (谁被触发了)

​ 事件 (用什么方式触发,点击还是鼠标经过等)

​ 事件处理程序 (要做什么事情)

事件案例1

    <script>
      /* 
      触发事件dom元素
      事件类型
      事件触发了 做业务 函数
       */

      let btn1 = document.querySelector('.btn1');

      // 注册事件
      // btn1.addEventListener("事件类型","处理函数")

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

      let btn2 = document.querySelector('.btn2');
      btn2.addEventListener('click', function () {
        console.log('退出抽奖啦');
      });

      let div = document.querySelector('div');
      // mouseover  鼠标移入到 div 的区域内
      div.addEventListener('mouseover', function () {
        console.log('小哥快点进来');
      });
    </script>
复制代码

事件案例2 :点击按钮溢出,就减少一次

    <button>1000</button>
    <script>
      // 点击一下 按钮   按钮中的1000 - 1
      // 点击一下  999
      // 点击一下  998
      // 点击一下  997
      // 。。。。

      let button = document.querySelector('button');

      // 注册 绑定点击事件
      button.addEventListener('click', function () {
        // 1 获取一下 按钮中的文本
        // console.log(button.innerText);

        // let num = button.innerText;// 数据类型是字符串 比较注意 做 +  运算
        // console.log(num + 1);// 字符串拼接
        // console.log(num - 1);// 隐式转换 转成成数字

        // button.innerText = button.innerText - 1;// 不用担心变成字符串
        // button.innerText = button.innerText + 1;// + 变成字符串

        // num = num -1 //  num-=1 //  --num
        // button.innerText -= 1;

        // 字符串 ++  或者 -- 也会做隐式转换!! 
        
        
        // --button.innerText;
        // ++button.innerText
        // button.innerText += 1; // 不会做隐式转换 

   		 button.innerText--;

      // 学js基础 先入一个门 没有经常写个不同的案例,怎么可能 刚刚学完js =  精通案例的实现!! 

      // 在后期的阶段中 不断写案例  新技术 巩固旧的案例的知识 !! 

      // 我几天学完了webapi 精通 做js案例  很多案例的设计 使用技巧 都没有碰到 
      });
    </script>
复制代码

案例3随机点名

需求:点击按钮之后,随机显示一个名字,如果没有显示则禁用按钮

  • 老师的实现过程 不是按照现在代码的结构 上到下 一口气写完

  • 给两个按钮注册了两个点击事件 分别测试他们的功能

  • 再在两个按钮中 实现 一个开启 定时器 一个关闭定时器

  • 再在开启的定时器中 来编写业务逻辑


    <script>
      /* 
      1 按钮1  
        1 注册点击事件  开启定时器
        2 定时器内部
          1 随机获取一个下标(提前把 名字数组定义好)
          2 数组[下标]  要显示的名称
          3 要显示名称 设置到 dom元素中 

      2 按钮2
        1 清除按钮1 中  定时器 

      3 开启定时器要做的工作 

       */

      let btn1 = document.querySelector('.btn1');
      let btn2 = document.querySelector('.btn2');
      let h1 = document.querySelector('h1');

      // 声明一个全局变量
      let timeId;
      // 注册开启定时器 点击事件
      btn1.addEventListener('click', function () {
        // 开启定时器 返回定时器id 用来清除定时器

        // 声明变量的时候 如果 不使用let 关键字 它变成了全局变量
        // 不推荐!! 代码不规范
        timeId = setInterval(function () {
          //  定时器的业务
          let arr = ['张飞', '赵云', '刘备', '吕布', '刘婵'];

          // 根据数组的长度来获取随机数
          let index = Math.round(Math.random() * (arr.length - 1));
          h1.innerText = arr[index];
        }, 100);
      });
      // 注册清除定时器 点击事件
      btn2.addEventListener('click', function () {
        clearInterval(timeId);
      });
    </script>
复制代码

事件类型

常见事件类型

click 单击事件
mouseenter 鼠标进入,当鼠标进入到该元素的范围就会自动触发
mouseleave 鼠标离开,鼠标离开该元素的范围就会自动触发
input 文本输入框内容变化所触发的事件,只要内容变化就会触发
fcous 文本框聚焦事件,文本框获取焦点,焦点就是光标点
change 文本框失焦事件,前提是内容改变了
blur 文本框的失焦事件,只要失焦就会触发,不关注内容是否变化
keydown keydown键按下时自动触发
keyup 键松开时自动触发
change 对于表单元素file而言,它 是用户选择好文件之后触发

高阶函数

目标:掌握高阶函数用法,实现函数更多使用形式

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

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

学习路径:1.表达式 2.回调函数

案例

全选文本框案例

需求:用户点击全选,则下面复选框全部选择,取消全选则全部取消,文字对应变化

①:全选复选框点击,可以得到当前按钮的 checked

②:把下面所有的小复选框状态checked,改为和全选复选框一致

③:如果当前处于选中状态,则把文字改为取消, 否则反之

  1. 获取 全选标签 绑定点击事件 checkAll
  2. 点击事件触发后 获取 复选框的选中属性 checkAll.checked
  3. 把全选按钮的选中状态 设置到每一个 其他复选框中
  4. 数组和循环思想 解决重复工作的

代码图

  <script>
    /* 
    1 获取全选按钮和 一组 商品复选按钮
    2 给全选按钮绑定点击事件
    3 给一组商品 绑定点击事件 
     */
    let checkAll =document.querySelector("#checkAll");
    let checkboxList =document.querySelectorAll(".ck");
 
    checkAll.addEventListener('click',function(){

      for(let index=0;index< checkboxList.length;index++){

          checkboxList[index].checked = checkAll.checked;
      }
    });
    // 
      for(let index=0; index<checkboxList.length;index++){

          checkboxList[index].addEventListener('click',function(){
            let checked =isAllChecked();
            checkAll.checked=checked;
          });

        }

    function isAllChecked(){
      let checkedNum =0;
      for(let index =0;index<checkboxList.length;index++){
        // 判断为true
        if(checkboxList[index].checked){
            checkedNum++;
        }
      }
      if(checkedNum ===checkboxList.length){
          
        return true;
      }else{
        return false;
      }
    }
  </script>
复制代码

小米搜索框案例

需求:当表单得到焦点,显示下拉菜单,失去焦点隐藏下来菜单

①:开始下拉菜单要进行隐藏

②:表单获得焦点 focus,则显示下拉菜单,并且文本框变色(添加类)

③:表单失去焦点,反向操作

    <div class="mi">
      <input type="search" placeholder="小米笔记本" />
      <ul class="result-list">
        <li><a href="#">全部商品</a></li>
        <li><a href="#">小米11</a></li>
        <li><a href="#">小米10S</a></li>
        <li><a href="#">小米笔记本</a></li>
        <li><a href="#">小米手机</a></li>
        <li><a href="#">黑鲨4</a></li>
        <li><a href="#">空调</a></li>
      </ul>
    </div>
    <script>
        /*  
            1.获取元素
            2.输入添加聚焦事件
            3.为输入框添加失角事件
        */
        let input =document.querySelector("input");
        let ul =document.querySelector('ul');
        let li =document.querySelectorAll('li');
        input.addEventListener('click',function(){
            ul.style.display="block";
        })
        input.addEventListener('blur',function(){
            ul.style.display='none';
        })

    </script>
复制代码

微博输入案例

需求:用户输入文字,可以计算用户输入的字数

分析:

①:判断用输入事件 input

②:不断取得文本框里面的字符长度

    <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>
      // 1.获取元素
      let textarea =document.querySelector('textarea');
      let useCount= document.querySelector('.useCount');
    // 为添加文本的事件
    textarea.addEventListener('input',function(){
        useCount.innerText =textarea.value.trim().leng``th;
    });

    </script>
复制代码

环境变量

能够分析判断函数运行在不同环境中this所指代的对象

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

谁调用 ,this就是谁

   <script>
        // 1获取每一个li标签
        // 2 li标签 点击事件
          //  3事件触发  设置被点击的li标签  选中的样式
          // 4.写处理其他所有的元  让他们的背景颜色变成白色
        // 
          let items =document.querySelectorAll('.tab-item');  
          let main =document.querySelectorAll('.main');  
          /* 
            1.给标题标签  给他们绑定点击事件
            2.事件触发 开始使用排他思想
              1.获取所有的要设置标题样式的标签 遍历他们 移除他们
              2.通过this 给自己
        
          */
          for(let i=0;i<items.length;i++){
              items[i].addEventListener('click',function(){
                  
                  for(let i=0;i<items.length;i++){

                      items[i].classList.remove('active');
                  }
                  this.classList.add('active');

                  // 处理图片显示部分
                  for(let j=0;j<main.length;j++){
                    main[j].classList.remove('active');
                  }

                    main[i].classList.add('active');



              });
          }

    </script>
复制代码

猜你喜欢

转载自juejin.im/post/7083508068201267231