nefu-xiaoshuang  

Web API 第二天

>>>>>>>事件

什么是事件?
事件是在编程时系统内发生的动作或者发生的事情
比如用户在网页上单击一个按钮
什么是事件监听
就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 注册事件
语法:
元素.addEventListener('事件',要执行的函数)
 
事件监听三要素
事件源: 那个dom元素被事件触发了,要获取dom元素
事件: 用什么方式触发,比如鼠标单击 click、鼠标经过 mouseover 等
事件处理程序: 要做什么事
注意:1.事件类型需要加引号
   2.函数是点击之后再去执行,每次点击都会执行一次
 //1.获取元素
        let btn = document.querySelector('button')
        //2.事件监听(注册事件)
        btn.addEventListener('click',function(){
            alert(`被点击了`)
        })

案例:

淘宝点击关闭二维码
需求:点击关闭之后,淘宝二维码关闭
案例
分析:
①:点击的是关闭按钮
②:关闭的是父盒子
核心:利用样式的显示和隐藏完成, display:none 隐藏元素 display:block 显示元素
 <style>
        * {
            margin: 0;
            padding: 0;
        }

        .erweima {
            position: relative;
            width: 160px;
            height: 160px;
            margin: 100px auto;
            border: 1px solid #ccc;
        }

        .erweima i {
            position: absolute;
            left: -13px;
            top: 0;
            width: 10px;
            height: 10px;
            border: 1px solid #ccc;
            font-size: 12px;
            line-height: 10px;
            color: #ccc;
            font-style: normal;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="erweima">
        <img src="./images/code.png" alt="">
        <i class="close_btn">x</i>
    </div>
    <script>
        //1.获取元素 事件源i 关闭的 erweima
        let close_btn = document.querySelector('.close_btn')
        let erweima = document.querySelector('.erweima')
        //2.事件监听
        close_btn.addEventListener('click',function() {
            //erweima隐藏
            erweima.style.display = 'none'
        })
    </script>
</body>

 

 
随机点名
需求:点击按钮之后,随机显示一个名字,如果没有显示则禁用按钮
案例
分析:
①:点击的是按钮
②:随机抽取一个名字
③: 当名字抽取完毕,则利用 disabled 设置为 true
</head>
    <style>
        div{
            width: 200px;
            height: 40px;
            border: 1px solid pink;
            text-align: center;
            line-height: 40px;
        }
    </style>
<body>
    <div>开始点名吧</div>
    <button>点击点名</button>
    <script>
        //1.获取元素 div 和 button
        let box = document.querySelector('div')
        let btn = document.querySelector('button')
        //2.随机函数
        function getRandom (min,max) {
            return Math.floor(Math.random() * (max- min + 1)) + min
        }
        //声明一个数组
        let arr = ['赵云','刘备','曹操','关羽','张飞']
        //事件监听
        btn.addEventListener('click',function(){
            let random = getRandom(0,arr.length-1)
            box.innerHTML =arr[random] 
            //删除数组里面的元素 splice(从哪里删,删几个)
            arr.splice(random,1)
            //抽到最后一个禁用按钮,如果数组没有了,就要禁用按钮
            if(arr.length === 0) {
                // console.log('最后一个了')
                btn.disabled = true 
                btn.innerHTML = '已经抽完'
            }
        })
        
    </script>

 

 
随机点名案例
案例
需求:点击开始随机抽取,点击结束输出结果
业务分析:
① 点击开始按钮随机抽取数组的一个数据,放到页面中
② 点击结束按钮删除数组当前抽取的一个数据
③ 当抽取到最后一个数据的时候,两个按钮同时禁用
核心:利用定时器快速展示,停止定时器结束展示
<style>
        * {
            margin: 0;
            padding: 0;
        }

        h2 {
            text-align: center;
        }

        .box {
            width: 600px;
            margin: 50px auto;
            display: flex;
            font-size: 25px;
            line-height: 40px;
        }

        .qs {

            width: 450px;
            height: 40px;
            color: red;

        }

        .btns {
            text-align: center;
        }

        .btns button {
            width: 120px;
            height: 35px;
            margin: 0 50px;
        }
    </style>
</head>

<body>
    <h2>随机点名</h2>
    <div class="box">
        <span>名字是:</span>
        <div class="qs">这里显示姓名</div>
    </div>
    <div class="btns">
        <button class="start">开始</button>
        <button class="end">结束</button>
    </div>

    <script>
        // 数据数组
        let arr = ['马超', '黄忠', '赵云', '关羽', '张飞']
        function getRandom(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min
        }
        //1.获取元素 两个按钮+div
        let start = document.querySelector('.start')
        let end= document.querySelector('.end')
        let qs= document.querySelector('.qs')
        //timer 要是全局变量
        let timer = 0 
        //random要是全局变量
        let random  = 0
        //2.给开始按钮注册事件
        start.addEventListener('click',function(){
            //随机抽数据,不断快速的抽取
             timer = setInterval(function(){
             random = getRandom(0,arr.length-1)
             qs.innerHTML = arr[random]
            },150)
            //如果到了最后一个,就禁用两个按钮
            if(arr.length === 1){
                start.disabled = true
                end.disabled = true
            }
        })
        //3.给结束按钮注册事件 本质是停止计时器
        end.addEventListener('click',function(){
            //停止计时器,timer是局部变量,在这个函数里面不能使用
            clearInterval(timer)
            //删除数组元素
            arr.splice(random,1)
            
        })

    </script>
</body>

</html>

 

 
>>>>>拓展阅读-事件监听版本
 DOM L0
事件源.on事件 = function() { }  偶尔会用
 <button>点击我</button>
    <script>
        //获取事件的方法二
        let btn = document.querySelector('button')
        btn.onclick  = function() {
            alert(11)
        }
    </script>

 

 DOM L2
事件源.addEventListener(事件, 事件处理函数)  常用
了解以下
 发展史:
 DOM L0 :是 DOM 的发展的第一个版本; L:level
 DOM L1:DOM级别1 于1998年10月1日成为W3C推荐标准
 DOM L2:使用addEventListener注册事件
 DOM L3: DOM3级事件模块在DOM2级事件的基础上重新定义了这些事件,也添加了一些新事件类型
>>>>>事件类型
鼠标触发
click 鼠标点击
mouseenter 鼠标经过
mouseleave 鼠标离开
表单获得光标
focus 获得焦点
blur 失去焦点
键盘触发
Keydown 键盘按下触发
Keyup 键盘抬起触发
表单输入触发
input 用户输入事件
 
案例
小米搜索框案例
需求:当表单得到焦点,显示下拉菜单,失去焦点隐藏下来菜单
案例
分析:
①:开始下拉菜单要进行隐藏
②:表单获得焦点 focus,则显示下拉菜单,并且文本框变色(添加类)
③:表单失去焦点,反向操作
 
style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        ul {

            list-style: none;
        }

        .mi {
            position: relative;
            width: 223px;
            margin: 100px auto;
        }

        .mi input {
            width: 223px;
            height: 48px;
            padding: 0 10px;
            font-size: 14px;
            line-height: 48px;
            border: 1px solid #e0e0e0;
            outline: none;
        }

        .mi .search {
            border: 1px solid #ff6700;
        }

        .result-list {
            display: none;
            position: absolute;
            left: 0;
            top: 48px;
            width: 223px;
            border: 1px solid #ff6700;
            border-top: 0;
            background: #fff;
        }

        .result-list a {
            display: block;
            padding: 6px 15px;
            font-size: 12px;
            color: #424242;
            text-decoration: none;
        }

        .result-list a:hover {
            background-color: #eee;
        }
    </style>

</head>

<body>
    <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.获取元素  input表单 [type=search]避免后面重复
        let search = document.querySelector('input[type=search]')
        let list = document.querySelector('.result-list')
        //2.事件监听 获得光标事件  focus
        search.addEventListener('focus',function(){
            //显示下拉菜单 
            list.style.display= 'block'
            //文本框变色
            search.classList.add('search')
        })
        //3.事件监听 失去光标事件 blur
        search.addEventListener('blur',function(){
            //隐藏下拉菜单 
            list.style.display= 'none'
            //文本框变色
            search.classList.remove('search')
        })
    </script>
</body>

</html>

 

微博输入案例
需求:用户输入文字,可以计算用户输入的字数
案例
分析:
①:判断用输入事件 input
②:不断取得文本框里面的字符长度
③:把获得数字给下面文本框
<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>
    //1.获取元素 文本域 count 
    let area = document.querySelector('#area')
    let useCount = document .querySelector('.useCount')
    //2.绑定事件, 用户输入事件 input
    area.addEventListener('input',function(){
      //不断得到文本域里面得到字符串长度
      //area.value可以获得值 但是我们需要长度
      //console.log(area.value.length)
      useCount.innerHTML = area.value.length
    })
  </script>
</body>

</html>

 

 
全选文本框案例1
需求:用户点击全选,则下面复选框全部选择,取消全选则全部取消,文字对应变化
案例
分析:
①:全选复选框点击,可以得到当前按钮的 checked
②:把下面所有的小复选框状态checked,改为和全选复选框一致
③:如果当前处于选中状态,则把文字改为取消, 否则反之
 
全选文本框案例2
需求:用户点击全选,则下面复选框全部选择,取消全选则全部取消,文字对应变化
案例
分析:
①:遍历下面的所有的checkbox,添加点击事件
②:在事件内部,遍历所有的checkbox状态,只要有一个为false 就将全选状态设置为false , 把文字改
为全选,并且直接return (退出循环)
③:在循环结束将全选的状态直接设置为true
 
//1.获取元素 全选 和小的复选框
    let all = document.querySelector('#checkAll')
    let cks =document.querySelectorAll('.ck')
    let span = document.querySelector('span')
    //2.事件监听 全选按钮
    all.addEventListener('click',function(){
      //all.checked要么是true 要么是false
      //我们需要做的就是将all.checked给下面三个小按钮
      //因为三个按钮在伪数组里面,我们需要遍历的方式,挨着取出来,依次给支
      for(let i = 0;i<cks.length;i++) {
        cks[i].checked = all.checked
      }
      //当我们的全选按钮处于选中状态,则可以改为取消
      if(all.checked ){
        span.innerHTML = '取消'
      }else{
        span.innerHTML='全选'
      }
    })
    //3.小按钮的做法 给多个元素绑定相同事件 
    for(let i = 0;i< cks.length;i++) {
      //绑定事件  cks[i]数组中的每个对象
      cks[i].addEventListener('click',function(){
        //只要点击任何一个小按钮 都要遍历所有小按钮
        for(let j = 0;j < cks.length;j++) {
          //来看看是不是有人没被选中
          if(cks[j].ckecked === false) {
            //return 是退出循环 return 是退出函数
            //如果有false 则退出循环
            all.checked = false
            span.innerHTML= '全选'
            return 
          }
        }
        //当我们的循环结束,如果代码走到这里,说明没有false,都被选中了
        all.checked = true
        span.innerHTML = '取消'
      })
    }

 

购物车加减操作
需求:用户点击加号,则文本框+1,点击减号,则文本框-1,如果文本框为1,则禁用减号
案例
分析:
①:给添加按钮注册点击事件, 获取表单的value,然后自增
②:解除减号的disabled状态
③:给减号按钮添加点击事件,获取表单的value,然后自减
④:自减结束需要判断,如果结果小于等于1 则添加上disabled状态
prompt 和一般的表单取过来的值一般都是字符串型
<style>
    div {
      width: 80px;
    }

    input[type=text] {
      width: 50px;
      height: 44px;
      outline: none;
      border: 1px solid #ccc;
      text-align: center;
      border-right: 0;
    }

    input[type=button] {
      height: 24px;
      width: 22px;
      cursor: pointer;
    }

    input {
      float: left;
      border: 1px solid #ccc;

    }
  </style>
</head>

<body>
  <div>
    <input type="text" id="total" value="1" readonly>
    <input type="button" value="+" id="add">
    <input type="button" value="-" id="reduce" disabled>
    <script>
      //需要操作三个元素,首先需要改加和减,然后需要改数量
      //1.获取三个元素
      let total = document.querySelector('#total')
      let add = document.querySelector('#add')
      let reduce = document.querySelector('#reduce')
      //2.点击加号,事件监听
      add.addEventListener('click',function(){
        //这个typeof可以将是什么类型的数据表现出来,黑色的是字符串
        // console.log(typeof total.value)
        // 小技巧 i++ 特点是有隐式转化 与 i= i+1 
        total.value++ 
        //我不是不可用,我就是可用的
        reduce.disabled = false
      })
      //3.点击减号,事件监听
      reduce.addEventListener('click',function(){
        //比较运算符也有隐式转化 难点
        total.value--
       if (total.value <= 1)
       {
        reduce.disabled = true
       }
       
      })
    </script>
  </div>
</body>

</html>

 

 
 
>>>>高阶函数
高阶函数可以被简单理解为函数的高级应用,JavaScript 中函数可以被当成【值】来对待,基于这个特性实现函数的高
级应用。
<script>
        let count = 10 
        //将10赋值给count
        let fn = function() {

     }
     //将函数赋值给fn,此时称为高阶函数
    </script>

 

【值】就是 JavaScript 中的数据如数值、字符串、布尔、对象等
1.函数表达式
 //函数表达式与普通函数并无本质上的区别
        let counter = function (x,y) {
            return x+y
        }
        //调用函数
        let result = counter(5,10)
        console.log(result)

函数表达式必需要先申明再调用

2.回调函数

当一个函数当做参数来传递给另外一个函数的时候,这个函数就是回调函数
function fn () {
        console.log('我是回调函数...')
       }
       setInterval(fn,1000)
1. 函数表达式
 函数也是【数据】
 把函数赋值给变量
2. 回调函数
 把函数当做另外一个函数的参数传递,这个函数就叫回调函数
 回调函数本质还是函数,只不过把它当成参数使用
 使用匿名函数做为回调函数比较常见
高阶函数
       // 1.函数表达式
        let count = 10 
        //将10赋值给count
        let fn = function() {

     }
     
     //2.回调函数,回调函数是将函数当成参数处理
     //setInterval(function,1000)
     function fn() {}
     //过一秒后再调用fn
     setInterval(fn,1000)
    //还有一个也是回调函数
    box.addEventListener('click',function(){})
    //此时function(){}被称为回调函数,用户点击box后,再来调用函数
    //第二种写法
    box.addEventListener('click',fun)
    function fun () {

    }

 

环境对象
环境对象指的是函数内部特殊的变量 this ,它代表着当前函数运行时所处的环境
作用:弄清楚this的指向,可以让我们代码更简洁
 函数的调用方式不同,this 指代的对象也不同
【谁调用, this 就是谁】 是判断 this 指向的粗略规则
 直接调用函数,其实相当于是 window.函数,所以 this 指代 window
//环境对象 this 他是个对象
    情形一
    function fn() {
        console.log(this)
        //而此处的this是指window
    }
    window.fn()
    情形二
    let btn = document.querySelector('button')
    btn.addEventListener('click',function(){
        //此时的this是指btn
        console.log(this)
    })

 

编程思想
排他思想
当前元素为A状态,其他元素为B状态
使用:
1. 干掉所有人
使用for循环
2. 复活他自己
通过this或者下标找到自己或者对应的元素
<style>
    .pink{
        background-color: pink;
    }
   </style> 
<body>
   <button class="pink">第1个</button><button>第2个</button><button>第3个</button><button>第4个</button><button>第5个</button>
   <script>
    let btn  = document.querySelectorAll('button')
    for(let i = 0;i<btn.length;i++)
    {
        btn[i].addEventListener('click',function(){
            //点谁谁就是this
             //this.classList.add('pink')
            //  //1.先·干掉所有人
            //  for(let j = 0;j<btn.length;j++){
            //     btn[j].classList.remove('pink')
            //  }
            //我们找出那个唯一的pimk类.删除
            document.querySelector(".pink").classList.remove('pink')
             //复活我自己
             this.classList.add('pink')
        })
    }
   </script>
</body>
</html>

 

classLIst属性返回元素的类名,作为DOMTokenList对象

该属性用于在元素中添加、移出、切换css类

语法:elem.classList

方法:

add( String[,String]):添加指定的类值。如果这些类已经存在于元素的属性中,那么他们将被忽略

remove(String[,String]):删除指定的类值

item(Number):按集合中的索引返回类值

toggle(String[,force]):

综合案例
需求:点击不同的选项卡,底部可以显示 不同的内容
分析:
①:点击当前选项卡,当前添加类,其余的兄弟移除类, 排他思想
②:下面模块盒子全部隐藏,当前的模块显示
posted on 2022-12-05 17:56  nefu-123  阅读(32)  评论(0编辑  收藏  举报