02-事件

143 阅读3分钟

什么是事件?

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

什么是事件监听?

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

语法:

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

事件监听三要素:

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

事件监听:

<button>点我</button>
    <script>
        // 获取元素
        let btn = document.querySelector('button')
        // 事件监听(注册事件)
        btn.addEventListener('click',function(){
            alert('被点击了')
        })
    </script>

注意:

​ 事件类型要加引号

​ 函数是点击之后再去执行,每次点击都会执行一次

案例:点击按钮关闭二维码

<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>

案例:随机点名

<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 = ['刘备', '曹操', '关羽']
        // 3. 事件监听
        btn.addEventListener('click', function () {
            // 随机的数字
            let random = getRandom(0, arr.length - 1)
            // console.log(arr[random])
            box.innerHTML = arr[random]
            // 删除数组里面的元素  splice(从哪里删, 删几个)
            arr.splice(random, 1)
            // 如果数组没有了 长度为0,就要禁用按钮
            if (arr.length === 0) {
                // console.log('最后一个了')
                btn.disabled = true
                btn.innerHTML = '已经抽完'
            }
        })
    </script>

事件监听版本

  • DOM L0

事件源.on事件 = function() { }

  • DOM L2

事件源.addEventListener(事件, 事件处理函数)

  • 发展史:

DOM L0 :是 DOM 的发展的第一个版本; L:level

DOM L1:DOM级别1 于1998年10月1日成为W3C推荐标准

DOM L2:使用addEventListener注册事件

DOM L3: DOM3级事件模块在DOM2级事件的基础上重新定义了这些事件,也添加了一些新事件类型

事件类型

鼠标事件
click单击鼠标按钮时触发
dblclick当用户双击主鼠标按钮时触发
mousedown当用户按下鼠标还未弹起时触发
mouseup当用户释放鼠标按钮时触发
mouseover当鼠标移到某个元素上方时触发
mouseout当鼠标移出某个元素上方时触发
mousemove当鼠标指针在元素上移动时触发
mouseenter在鼠标光标从元素外部首次移动至元素范围内触发,不参与冒泡 ★
mouseleave鼠标移出,不参与冒泡 ★
键盘事件
keydown当用户按下键盘上任意键时触发,如果按住不放,会重复触发
keyup当用户释放键盘上的键触发
keypress当用户按下键盘上的字符键时触发,如果按住不放,会重复触发
HTMl事件
load当页面完全加载后在window上面触发,或当框架集加载完毕后在框架集上触发
unload当页面完全卸载后在window上面触发,或当框架集卸载后在框架集上触发
select当用户选择文本框(input或textarea)中的一个或多个字符触发
change当文本框(input或textarea)内容改变且失去焦点后触发
input输入
focus当页面或者元素获得焦点时在window及相关元素上面触发
blur当页面或元素失去焦点时在window及相关元素上触发
submit当用户点击提交按钮在元素上触发
reset当用户点击重置按钮在元素上触发
resize当窗口或框架的大小变化时在window或框架上触发
scroll当用户滚动带滚动条的元素时触发

小米搜索框案例

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

  • CSS

    <style>
            * {
                padding: 0;
                margin: 0;
                box-sizing: border-box;
            }
            ul {
                list-style: none;
            }
            .mi {
                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;
                transition: all .3s;
            }
            .mi .search {
                border: 1px solid #ff6700;
            }
            .list {
                display: none;
                width: 223px;
                border: 1px solid #ff6700;
            }
            .list a {
                display: block;
                padding: 6px 15px;
                text-decoration: none;
                font-size: 12px;
                color: #424242;
            }
            .list a:hover {
                background-color: #eee;
            }
    </style>
    
  • HTML

    <div class="mi">
            <input type="search" placeholder="小米笔记本">
            <ul class="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>
    
  • javascript

    <script>
            // 获取元素
            let search = document.querySelector('input')
            let list = document.querySelector('.list')
            // 事件监听 获得光标事件  focus
            search.addEventListener('focus', function() {
                // 显示下拉菜单
                list.style.display = 'block'
                // 文本框变色
                search.classList.add('search')
            })
            // 事件监听 失去光标事件  blur
            search.addEventListener('blur', function() {
                // 隐藏下拉菜单
                list.style.display = 'none'
                // 文本框去色
                search.classList.remove('search')
            })
    </script>
    

xm.gif

评论案例

  • CSS

    <style>
            * {
                padding: 0;
                margin: 0;
                box-sizing: border-box;
            }
            textarea {
                width: 500px;
                height: 100px;
                border-radius: 10px;
                padding: 10px 10px;
                resize: none;
                outline: none;
            }
            .pinlun {
                width: 500px;
                margin: 100px auto;
            }
            button {
                width: 50px;
                height: 30px;
                outline: none;
                background-color: rgb(37, 161, 103);
                color: rgb(255, 255, 255);
                border: 1px solid rgb(255, 255, 255);
                border-radius: 5px;
                cursor: pointer;
            }
            .pinlun div {
                float: right;
            }
    </style>
    
  • HTML

    <div class="pinlun">
            <textarea  placeholder="评论千万条,友善第一条" id="area" cols="30" rows="10" maxlength="200"></textarea>
            <div>
                <span class="count">0</span>
                <span>/</span>
                <span>200</span>
                <button>发布</button>
            </div>
    </div>
    
  • JavaScript

    <script>
            // 获取元素
            let area = document.querySelector('#area')
            let count = document.querySelector('.count')
            // 绑定事件  用户输入事件 input
            area.addEventListener('input', function() {
                //area.value.length 得到输入字符的长度
                count.innerHTML = area.value.length
            })
    </script>
    

全选文本框案例

  • CSS

     <style>
        * {
          margin: 0;
          padding: 0;
        }
    
        table {
          /* 边框会合并为一个单一的边框 */
          border-collapse: collapse;
          /* 表格的边框间距 */
          border-spacing: 0;
          border: 1px solid #c0c0c0;
          width: 500px;
          margin: 100px auto;
          text-align: center;
        }
    
        th {
          background-color: #09c;
          /* 字体加粗  字体大小  字体样式 */
          font: bold 16px "微软雅黑";
          color: #fff;
          height: 24px;
        }
    
        td {
          border: 1px solid #d0d0d0;
          color: #404060;
          padding: 10px;
        }
    
        .allCheck {
          width: 80px;
        }
      </style>
    
  • HTML

    <table>
        <tr>
          <th class="allCheck">
            <input type="checkbox" name="" id="checkAll"> <span class="all">全选</span>
          </th>
          <th>商品</th>
          <th>商家</th>
          <th>价格</th>
        </tr>
        <tr>
          <td>
            <input type="checkbox" name="check" class="ck">
          </td>
          <td>小米手机</td>
          <td>小米</td>
          <td>¥1999</td>
        </tr>
        <tr>
          <td>
            <input type="checkbox" name="check" class="ck">
          </td>
          <td>小米净水器</td>
          <td>小米</td>
          <td>¥4999</td>
        </tr>
        <tr>
          <td>
            <input type="checkbox" name="check" class="ck">
          </td>
          <td>小米电视</td>
          <td>小米</td>
          <td>¥5999</td>
        </tr>
      </table>
    
  • javascript

    <script>
        // 1. 获取元素  全选 和   ck 小复选框
        let all = document.querySelector('#checkAll')
        let cks = document.querySelectorAll('.ck')
        let span = document.querySelector('span')
        // 2. 事件监听   全选按钮  
        all.addEventListener('click', function () {
          // console.log(all.checked)  // true  false 
          // 我们需要做的就是把 all.checked 给下面三个小按钮
          // 因为三个按钮在伪数组里面,我们需要遍历的方式,挨着取出来,依次给值
          for (let i = 0; i < cks.length; i++) {
            cks[i].checked = all.checked
          }
          // 当我们的全选按钮处于选中状态,则可以改为取消
          if (all.checked) {
            // console.log('要改')
            span.innerHTML = '取消'
          } else {
            span.innerHTML = '全选'
          }
        })
    
    
        // 3. 小按钮的做法 同时给多个元素绑定相同事件
        for (let i = 0; i < cks.length; i++) {
          // 绑定事件
          cks[i].addEventListener('click', function () {
            // console.log(11)
            // 只要点击任何一个小按钮,都要遍历所有的小按钮  
            for (let j = 0; j < cks.length; j++) {
              // 都来看看是不是有人没有选中
              if (cks[j].checked === false) {
                // 如果有false 则退出循环 结束函数
                all.checked = false
                span.innerHTML = '全选'
                return
              }
            }
            // 当我们的循环结束,如果代码走到这里,说明没有false,都被选中了,则全选按钮要选中
            all.checked = true
            span.innerHTML = '取消'
          })
        }
    
    </script>
    

购物车加减操作

需求:用户点击加号,则文本框+1,点击减号,则文本框-1,如果文本框为1,则禁用减号

  • CSS

     <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>
    
  • HTML

    <div>
            <input type="text" id="total" value="1" readonly>
            <input type="button" value="+" id="add">
            <input type="button" value="-" id="reduce" disabled>
    </div>
    
  • JavaScript

    <script>
          // 1. 获取元素  三个
          let total = document.querySelector('#total')
          let add = document.querySelector('#add')
          let reduce = document.querySelector('#reduce')
          // 2. 点击加号 事件侦听  
          add.addEventListener('click', function () {
            // console.log(typeof total.value)
            // total.value = total.value + 1
            // i++   隐式转换
            // i = i + 1 
            total.value++
            reduce.disabled = false
          })
          // 3. 点击减号 事件侦听  
          reduce.addEventListener('click', function () {
    
            total.value--
            if (total.value <= 1) {
              reduce.disabled = true
            }
          })
    
          // 2 === '2'
    </script>
    

点击按钮切换图片