Dom事件基础

131 阅读2分钟

一.事件介绍

事件是在编程中发生的动作或者发生的动作 (比如用户在网页上单击一个事件—)

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

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

事件监听(绑定事件 注册事件 事件侦听)三要素

 事件源:那个dom元素被事件触发了要获取dom元素
 事件:用什么方法触发,比如对点击事件
 事件调用的函数:要做的事情
 

记得事件要加引号

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

关闭二维码小案例

   <!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>关闭二维码</title>
<style>
    div {
        width: 300px;
        height: 500px;
        margin: 100px auto;
        position: relative;
        background-color: aqua;
    }
    
    img {
        width: 100%;
        height: 100%;
    }
    
    span {
        position: absolute;
        font-size: 30px;
    }
</style>
  </head>

  <body>
 <div class="wrap">
    <img src="../img/ouwenvx.jpg" alt="">
    <span class="dianji">x</span>
</div>
 </body>
   <script>
// 获取元素
let dianji = document.querySelector('.dianji')
let wrap = document.querySelector('.wrap')
    // 事件监听
dianji.addEventListener('click', function() {
    wrap.style.display = 'none'
})
      </script>

   </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>
    div {
        display: inline-block;
        border: 1px solid #333;
        width: 100px;
        height: 50px;
        line-height: 50px;
    }
</style>
</head>

    <body>
抽中的选手
<div></div>
<button>点击点名</button>
     </body>
     <script>
let box = document.querySelector('div')
let btn = document.querySelector('button')
    // 随机函数
    // 随机数
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)
    document.getElementsByTagName('div')[0].innerHTML = arr[random]
        // 删除数组里面的元素
    arr.splice(random, 1)
        // 如果数组里面只剩下最后一个就要禁用按钮
    if (arr.length === 0) {
        console.log('最后一个')
        btn.disabled = true
        btn.innerText = '已经抽完'
    }
})
   </script>

    </html>
    

事件小案例NBA谁打球最好

 <!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>点击开始随机抽取,点击结束输出结果</title>
<style>
    .qs {
        display: inline-block;
        margin-bottom: 100px;
    }
</style>
      </head>
     <h2>NBA谁打球最好</h2>
      <div class="box">
<span>名字是:</span>
<div class="qs">这里显示名字</div>
      </div>
      <div class="btns">
<button class="start">开始</button>
<button class="end">结束</button>
    </div>

       <body>

      </body>
       <script>
// 随机数
function getRandom(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min
}
// 声明一个数组
let arr = ['欧文', '库里', '克莱', '威少', '詹姆斯', '乔治', '伦纳德', '莫兰特', '利拉德', '浓眉哥']
    // 获取元素
let start = document.querySelector('.start')
let end = document.querySelector('.end')
let qs = document.querySelector('.qs')
    // timer要是全局变量
let timer = 0
let random = 0
    // 开始给开始按钮注册事件
start.addEventListener('click', function() {
        // 随机抽数据---快速  间歇函数
        timer = setInterval(function() {
                let random = getRandom(0, arr.length - 1)
                qs.innerHTML = arr[random]
            }, 25)
            // 如果到了最后一个就警用两个按钮
        if (arr.length === 1) {
            start.disabled = end.disabled = true
        }
    })
    // 给结束按钮注册事件 本质是停止计时器
end.addEventListener('click', function() {
    clearInterval(timer)
        // 删除数组元素
    arr.splice(ranodm, 1)



})
    </script>

   </html>

事件类型

1.鼠标事件

  • 鼠标点击 click
  • 鼠标离开mouseleave
  • 鼠标经过mouseenter

2.焦点事件

  • focus获得焦点
  • blur失去焦点

3.键盘事件

  • keydown键盘按下触发
  • keyup 键盘抬起触发

4.文本事件

  • input 用户输入事件

小米搜索框小案例

 <!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>小米搜索框</title>
<link rel="stylesheet" href="../css/reset.css">
<style>
    .mi {
        width: 100px;
        border: 1px solid #333;
    }
    
    input {
        width: 100px;
    }
    
    .search {
        background-color: pink;
    }
    
    .list {
        display: none;
    }
    
    li {
        border: 1px solid #333;
        width: 100px;
        height: 20px;
    }
</style>
<!-- 当获得焦点下拉框失去焦点的时候隐藏 -->
      </head>

     <body>
<div class="mi">
    <input type="text" name="" id="" placeholder="小米笔记本" class="server">
    <ul class="list">
        <li class="item">欧文</li>
        <li class="item">欧文</li>
        <li class="item">欧文</li>
        <li class="item">欧文</li>
        <li class="item">欧文</li>
        <li class="item">欧文</li>
        <li class="item">欧文</li>
        <li class="item">欧文</li>

    </ul>
</div>

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

          }  
 </script>



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

       <body>
<!-- 分析  1.判断用输入事件input 2.不断取得文本框内里面的字符长度-->
<div class="w">
    <div class="controls">

    </div>
    <br>
    <textarea name="" id="area" cols="30" rows="10" placeholder="说点什么把" maxlength="200"></textarea>
    <div>
        <span class="uescount">0</span>
        <span>/</span>
        <span>200</span>
        <button id="send">发布</button>
    </div>
</div>
         </body>
          <script>
// 获取元素
let area = document.querySelector('#area')
let uescount = document.querySelector('.uescount')
    // 绑定事件 
area.addEventListener('input', function() {
    uescount.innerHTML = area.value.length
})

全选文本框案例(用户点击全选,则下面复选框全部选中,取消全选则全部取消,文字对应变化)

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

    </head>

      <body>
<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="" id="check" class="ck">
        </td>
        <th>欧文</th>
        <th>库里</th>
        <th>克莱</th>
    </tr>
    <tr>
        <td>
            <input type="checkbox" name="" id="checkA" class="ck">
        </td>
        <th>欧文</th>
        <th>库里</th>
        <th>克莱</th>
    </tr>
    <tr>
        <td>
            <input type="checkbox" name="" id="checkA" class="ck">
        </td>
        <th>欧文</th>
        <th>库里</th>
        <th>克莱</th>
    </tr>
    <tr>
        <td>
            <input type="checkbox" name="" id="checkA" class="ck">
        </td>
        <th>欧文</th>
        <th>库里</th>
        <th>克莱</th>
    </tr>
</table>
         </body>
             <script>
let all = document.querySelector('#checkall')
let cks = document.querySelectorAll('.ck')
let span = document.querySelector('span')
    // 事件监听
all.addEventListener('click', function() {

    // 我们需要做的就是把all.checked 给下面三个按钮
    // 因为三个按钮在伪数组里面遍历 挨个去除挨个给值
    for (let i = 0; i < cks.length; i++) {
        cks[i].checked = all.checked
    }
    // 当我们的全选按钮处于选中状态,则可以改为取消全选
    if (all.checked === true) {
        span.innerHTML = '取消'
    } else {
        span.innerHTML = '全选'
    }

 // 小按钮的做法
    // 1.遍历所有非checkbox添加点击事件
    //2. 在事件内部,遍历所有的checkbox状态只要有一个false把文字改为全选,并且直接returen(退出循环)
    // 3.再循环结束后将全选的状态直接设置为true
    for (let i = 0; i < cks.length; i++) {
        cks[i].addEventListener('click', function() {
            // 只要点击一个小按钮就要遍历所有的小按钮
            for (let j = 0; j < cks.length; j++) {
                if (cks[j].checked === false) {
                    all.checked = false
                    span.innerHTML = '全选'
                    return
                }
            }
            // 当循环结束说明没有false都被选中了
            all.checked = true
            span.innerHTML = '取消'
        })
    }

})
 </script>

 </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>购物车</title>
<!-- 用户点击加号,文本框加1点击减号文本框-1如果文本框为1则禁用减号 -->
        </head>

      <body>
<div>
    <input type="text" id="total" value="1" readonly>
    <input type="button" value="+" id="add">
    <input type="button" value="-" id="reduce" disabled>
</div>
<script>
    // 获取元素
    let total = document.querySelector('#tootal')
    let add = document.querySelector('#add')
    let treduce = document.querySelector('#reduce')
        // 点击加号事件监听
    add.addEventListener('click', function() {

            total.value++
                reduce.disabled = false
        })
        // 点击减号 事件监听
    reduce.addEventListener('click', function() {
        total.value--
            if (total.value <= 1) {
                reduce.disabled = true
            }
    })
</script>
       </body>

        </html>

二.高阶函数

为函数的高级应用,js中函数可以被当作值来对待

1.函数也是一个数据

2.把函数赋值给变量

回调函数

将函数A作为参数传递给函数B的时候,这个函数就是回调函数

function fun(){
        
    }
 setInterval(fn,1000)
 此时fn就是回调函数
 

回头去调用的函数 等着1秒到了回头调用这个函数

三.环境对象this

 function fun(){
    console.log(this)
   }
   fun()
   

环境对象this:

1.谁调用this,this就是谁 2.直接调用函数,其实相当于window.函数所以this指代window

四.编程思想

排他思想

当前状态为A状态,其他元素为B状态

使用:

1.干掉所有人

  使用for循环

2.复活自己

 通过this或者下标找到自己

小案例:tab栏切换

   <!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>切换</title>
<link rel="stylesheet" href="../css/reset.css">
<style>
    .wrapper {
        width: 100%;
        height: 50px;
        border: 1px solid #333;
        margin: 20px;
    }
    
    ul {
        width: 100%;
        height: 100%;
    }
    
    li {
        display: inline-block;
        border: 1px solid #333;
        width: 50px;
        height: 50px;
        line-height: 50px;
    }
    
    .wrap {
        margin: 20px;
        border: 1px solid #333;
    }
    
    .active {
        border-color: red;
        background-color: pink;
    }
    
    .wrap>div {
        width: 300px;
        height: 300px;
        display: none;
    }
    
    .wrap .actives {
        display: block;
    }
    
    .wrap>div>img {
        width: 100%;
        height: 100%;
    }
</style>
     </head>

          <body>
<div class="wrapper">
    <ul class="tab">
        <li class="tab-item active">篮网</li>
        <li class="tab-item">骑士</li>
        <li class="tab-item">湖人</li>
        <li class="tab-item">快船</li>

    </ul>
    <div class="wrap">
        <div class="mian actives">
            <img src="../img/kyrie1.png" alt="">
        </div>
        <div class="mian">
            <img src="../img/kyrie2.jpg" alt="">
        </div>
        <div class="mian">
            <img src="../img/kyrie3.jpg" alt="">
        </div>
        <div class="mian"><img src="../img/kyrie4.png" alt=""></div>
    </div>
</div>
        </body>
                <script>
// 头部tab栏切换模块
// 得到li
let lis = document.querySelectorAll('.tab-item')
let divs = document.querySelectorAll('.wrap div')
    // 先给li添加点击事件
for (let i = 0; i < lis.length; i++)
    lis[i].addEventListener('click', function() {
        // 找到以前的active类 移除
        document.querySelector('.tab .active').classList.remove('active')
        this.classList.add('active')
            // 底部显示隐藏模块 一定要写在点击事件里面
        document.querySelector('.wrap .actives').classList.remove('actives')
        divs[i].classList.add('actives')


    })
             </script>

              </html>