当前位置: 首页 > news >正文

JS事件基础

事件

@jarringslee

文章目录

  • 事件
      • 事件监听(绑定)
      • 事件类型
      • 事件对象
      • 环境对象this
      • 回调函数

事件是编程语言中的术语,它是用来描述程序的行为或状态的,一旦行为或状态发生改变,便立即调用一个函数。

例如:用户使用【鼠标点击】网页中的一个按钮、用户使用【鼠标拖拽】网页中的一张图片

事件监听(绑定)

结合 DOM 使用事件时,需要为 DOM 对象添加事件监听,检测到事件发生(被触发)时,便立即调用一个函数。

addEventListener 是 DOM 对象专门用来添加事件监听的方法,它的两个参数分别为【事件类型】和【事件回调】。

元素对象.addEventListener('事件类型', 要执行的函数)
        const arr = [ .... ]const start = document.querySelector('.start')const qs = document.querySelector('.qs')let go = nulllet random = null;start.addEventListener('click', function () {go = setInterval(function () {random = parseInt(Math.random() * arr.length)qs.innerHTML = arr[random]}, 50)if (arr.length === 1) start.disabled = end.disabled = true})const end = document.querySelector('.end')end.addEventListener('click', function () {clearInterval(go)arr.splice(random, 1)})

事件监听三要素:

  • 事件源: 哪个dom元素被事件触发。要获取dom元素
  • 事件类型: 用什么方式触发。如鼠标单击click、鼠标经过mouseover等
  • 事件调用的函数: 我们要做什么事

以前的方法:采用赋值的形式。弊端:后面会将前面覆盖掉

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

事件类型

事件类型事件英文名触发时机
鼠标事件
鼠标触发
click鼠标点击
mouseenter鼠标经过
mouseleave鼠标离开
焦点事件
表单获得光标
focus表单获得焦点
blur表单失去焦点
键盘事件
键盘触发
keydown键盘按下触发
keyup键盘抬起触发
文本事件
表单输入触发
input表单输入触发 / 用户输入事件

小案例:轮播图

  • 每隔两秒自动切换下一张;

  • 点击右侧/左侧按钮手动切换下一张/上一张;

  • 鼠标移到图片上停止自动切换,鼠标移开恢复自动切换。

    <script>// 1. 初始数据:轮播图的图像路径、标题文本、背景颜色const sliderData = [{ url: './images/slider01.jpg', title: '凤凰传奇陪你过大年', color: 'rgb(100, 67, 68)' },// ......]// 2. 当前轮播图索引初始化为0let i = 0// 3. 获取轮播图中需要操作的 DOM 元素const img = document.querySelector('.slider img')        // 图片元素const p = document.querySelector('.slider p')            // 标题文字元素const next = document.querySelector('.next')             // “下一张”按钮const prev = document.querySelector('.prev')             // “上一张”按钮const slider = document.querySelector('.slider')         // 整个轮播区域// 4. 点击“下一张”按钮时切换到下一张图片next.addEventListener('click', function () {i++  // 当前索引加一if (i >= sliderData.length) i = 0  // 超出最大索引则回到第一张// 替换图片地址、标题img.src = sliderData[i].urlp.innerHTML = sliderData[i].title// 更新下方指示器的样式document.querySelector('.slider-indicator .active').classList.remove('active')document.querySelector(`.slider-indicator li:nth-child(${i + 1})`).classList.add('active')})// 5. 点击“上一张”按钮时切换到上一张图片prev.addEventListener('click', function () {i--  // 当前索引减一if (i < 0) i = sliderData.length - 1  // 小于0则切换到最后一张img.src = sliderData[i].urlp.innerHTML = sliderData[i].titledocument.querySelector('.slider-indicator .active').classList.remove('active')document.querySelector(`.slider-indicator li:nth-child(${i + 1})`).classList.add('active')})// 6. 自动轮播功能(定时器模拟“点击右侧按钮”)let time = setInterval(function () {next.click()  // 每隔1秒自动点击“下一张”}, 1000)// 7. 鼠标移入时暂停自动播放slider.addEventListener('mouseenter', function () {clearInterval(time)  // 清除计时器,停止轮播})// 8. 鼠标移出后恢复自动播放(重新设置计时器)slider.addEventListener('mouseleave', function () {time = setInterval(function () {next.click()}, 1000)})</script>
    //实时打印输入内容
    input.addEventListener('input', function () {console.log(input.value)})
    

事件对象

任意事件类型被触发时与事件相关的信息会被以对象的形式记录下来,我们称这个对象为事件对象。比如在一个“鼠标点击”事件中,事件对象将会存储“鼠标点击了哪里”等信息。

使用场景:

  • 判断用户按下了哪个键,如:只有按下回车才能发布消息
  • 判断鼠标点击了哪个元素,从而做出相应的操作

获取事件的语法:

在事件绑定的回调函数中的第一个参数就是事件对象,一般命名为eventev或者e

元素.addEventListener('click', function(e){
} ) console.log(e.key)
//打印当前用户按下的键盘值

获取事件对象的常用属性:

部分常用属性:

  • type 获取当前事件的类型
  • clientX / clientY 获取光标相对于浏览器可见窗口的位置
  • offsetX / offsetY 获取光标相对于当前DOM元素左上角的位置
  • key 用户按下的键盘值(现在不常使用keycode)

去除字符串左右两边空格: 对象.trim()

const str = '    123   456   '
console.log(syr.trim())
//只会输出'123   456'

环境对象this

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

  • 函数调用方式不同,this指代的也有所不同

  • 谁调用函数,this就是谁

    • 没有任何前缀的函数默认是windows在调用

    • const btn = document.querySelector('button')
      btn.addEventListener('click', function fn() {console.log(this)this.style.background = 'blue'
      })//这里的this就是调用对象的btn
      

回调函数

如果将函数A作为参数传给函数B时,我们称函数A为回调函数

function fn (){//这就是一个回调函数
}
setInterval (fn, 1000)

事件监听中,例如’click’按下按钮出发的function函数也属于回调函数。

事件监听小案例:全选框的逻辑

    <table><tr><th class="allCheck"><input type="checkbox" name="" id="checkAll"><span class="all">全选</span></th><th>商品</th></tr><tr><td><input type="checkbox" name="check" class="ck"><td>小米手机</td></td></tr><tr><td><input type="checkbox" name="check" class="ck"><td>小米手机</td></td></tr><tr><td><input type="checkbox" name="check" class="ck"><td>小米手机</td></td></tr></table><script>const checkAll = document.querySelector('#checkAll')const ck = document.querySelectorAll('.ck')//第一段逻辑:如果点击勾选了「全选」,就让所有子选项也变成 checked = true;
//如果点击取消「全选」,就让所有子选项 checked = false。
//既实现了“勾选全选 -> 勾选所有项”,也实现了“取消全选 -> 取消所有项”。checkAll.addEventListener('click', function () {for (let i = 0; i < ck.length; i++) {ck[i].checked = checkAll.checked;}})//第二段逻辑:每次有子项点击时,都判断是不是所有子项都 checked == true;
////如果是,那就设置 checkAll.checked = true;
//如果有任意一个 checked == false,就设置 checkAll.checked = false。
//既实现了“只要有一个子项取消,全选取消”,也实现了“所有子项都手动勾选上后,全选会自动被勾上”。        for (let i = 0; i < ck.length; i++) {ck[i].addEventListener('click', function () {let flag = truefor (let j = 0; j < ck.length; j++) {if (ck[j].checked == false) {flag = false;break;}}checkAll.checked = flag;})}</script>
http://www.dtcms.com/a/296834.html

相关文章:

  • ESP-NOW无线通信协议:物联网设备间的高效对话方式
  • 前端基础知识Vue系列 - 24(axios的原理)
  • Linux(centos7)安装 docker + ollama+ deepseek-r1:7b + Open WebUI(内含一键安装脚本)
  • Windows下使用UIAutomation技术遍历桌面窗口和指定窗口内容的AutomationWalker.exe的C#源代码
  • QT元对象系统-(1)静态属性和动态属性
  • Jenkins配置与应用指南
  • 外贸公司经营步骤
  • AI赋能软件工程让测试左移更加可实施
  • 《C++》面向对象编程--类(下)
  • IPv6网络优化
  • ANSYS Fluent 管内流动仿真
  • 如何恢复mysql,避免被研发删库跑路
  • Python(09)正则表达式
  • 无人机云台跟踪目标实现
  • springboot项目建立sse接口
  • tokenID和位置嵌入有关系吗,qwen 模型使用时候仅仅有tokenid 映射为向量,位置编码在哪里
  • C++的虚基类?
  • 黑马头条项目详解
  • cmake应用:集成gtest进行单元测试
  • MUX同步器
  • 人工智能概念:常用的模型压缩技术(剪枝、量化、知识蒸馏)
  • 一篇文章了解HashMap和ConcurrentHashMap的扩容机制
  • ESP32入门实战:PC远程控制LED灯完整指南
  • pandas库的数据导入导出,缺失值,重复值处理和数据筛选,matplotlib库 简单图绘制
  • AD一张原理图分成多张原理图
  • iview Select的Option边框显示不全(DatePicker也会出现此类问题)
  • rust-参考与借用
  • 爬虫逆向--Day12--DrissionPage案例分析【小某书评价数据某东评价数据】
  • MySQL零基础教程增删改查实战
  • java后端