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

Javascript--事件

一.事件监听:

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

事件监听三要素:

1.事件源:谁被触发
2.事件类型:用什么方式触发,点击还是鼠标经过等
3.事件处理程序:要做什么事情

<button>点击</button>
<script>//需求:点击按钮弹出对话框//1.事件源 按钮//2.事件类型 点击//3.事件处理程序 弹出对话框const btn=document.querySelector('botton')btn.addEventListener('click',function(){alert('你好')})
</script>

二.随机点名案例

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {display: flex;width: 200px;height: 150px;margin: 0 auto;}.btn {padding: auto;display: flex;justify-content: center;gap: 30px}</style>
</head><body><h2 style="text-align: center;">随机点名</h2><div class="box"><span>名字是:</span><div class="qs" style="color: red;">这里显示姓名</div></div><div class="btn"><button class="start">开始</button><button class="end">结束</button></div><script>const arr = ['a', 'b', 'c', 'd', 'e']let n = 0let random = 0const start = document.querySelector('.start')const qs = document.querySelector('.qs')start.addEventListener('click', function () {n = setInterval(function () {random = parseInt(Math.random() * arr.length)qs.innerHTML = arr[random]}, 50)})if (arr.length == 0) start.disabled = end.disabled = trueconst end = document.querySelector('.end')end.addEventListener('click', function () {clearInterval(n)arr.splice(random, 1)})</script>
</body></html>

三.鼠标监听事件

事件名触发时机应用
click单击按钮交互、表单提交
mousedown按下鼠标拖拽开始、绘制工具
mouseup释放鼠标拖拽结束、完成选择
mouseenter鼠标进入元素悬停效果、导航菜单展开
mouseleave鼠标离开元素悬停效果消失、菜单收起
mousemove鼠标在元素上移动实时交互、鼠标跟随效果
contextmenu右键点击自定义菜单、功能扩展

四.焦点事件

1. 核心焦点事件

(1)获得焦点事件
  • focus:元素获得焦点时触发(不冒泡)。
  • focusin:元素获得焦点时触发(冒泡)。
(2)失去焦点事件
  • blur:元素失去焦点时触发(不冒泡)。
  • focusout:元素失去焦点时触发(冒泡)。

2. 触发焦点的方式

  • 键盘操作:通过 Tab 键在可聚焦元素间切换。
  • 鼠标点击:点击可聚焦元素(如输入框、按钮)。
  • JavaScript:通过 element.focus()element.blur() 方法。

3. 示例

(1)基本监听
const input = document.getElementById('username');// 获得焦点时添加高亮效果
input.addEventListener('focus', () => {input.style.borderColor = 'blue';
});// 失去焦点时恢复样式
input.addEventListener('blur', () => {input.style.borderColor = '';
});
(2)使用冒泡事件(focusin/focusout
const form = document.getElementById('myForm');// 监听表单内所有元素的焦点变化
form.addEventListener('focusin', (event) => {event.target.classList.add('focused');
});form.addEventListener('focusout', (event) => {event.target.classList.remove('focused');
});
事件类型触发时机冒泡特性
focus/blur元素获得/失去焦点时不冒泡
focusin/focusout元素获得/失去焦点时冒泡
click鼠标点击或 Enter/Space 键冒泡

五.键盘事件

1. 核心键盘事件

(1)按键触发顺序
  1. keydown:按下任意键时触发(重复按下会持续触发)。
  2. keypress:按下可打印字符键时触发(已逐渐被弃用,推荐使用 keydown)。
  3. keyup:释放按键时触发。
(2)事件触发时机
  • keydownkeypress:在按键被按下时触发,可能早于字符输入到输入框。
  • keyup:在按键释放后触发,常用于获取最终输入结果。

2. 事件对象属性

键盘事件触发时传递的事件对象(event)包含以下常用属性:

  • 按键标识

    • key:按键的字符串表示(如 'A''Enter''ArrowUp')。
    • code:按键的物理位置(如 'KeyA''Enter''ArrowUp')。
    • keyCode:已弃用,建议使用 keycode
  • 修饰键状态

    • ctrlKeyshiftKeyaltKeymetaKey:是否按下对应修饰键。
  • 特殊标志

    • repeat:是否为重复按键(持续按住时)。

3. 事件监听示例

(1)监听全局键盘事件
document.addEventListener('keydown', (event) => {console.log('按下键:', event.key);// 检测组合键(Ctrl+C)if (event.ctrlKey && event.key === 'c') {console.log('复制操作');}// 阻止默认行为(如禁止空格键滚动页面)if (event.key === ' ') {event.preventDefault();}
});
(2)输入框特定按键处理
const input = document.getElementById('search');input.addEventListener('keydown', (event) => {// 按下 Enter 键时提交搜索if (event.key === 'Enter') {performSearch(input.value);}
});
(3)方向键控制
document.addEventListener('keydown', (event) => {switch (event.key) {case 'ArrowUp':moveUp();break;case 'ArrowDown':moveDown();break;case 'ArrowLeft':moveLeft();break;case 'ArrowRight':moveRight();break;}
});

4. 应用场景

(1)快捷键功能
// 全局监听 Ctrl+S(保存)
document.addEventListener('keydown', (event) => {if ((event.ctrlKey || event.metaKey) && event.key === 's') {event.preventDefault(); // 阻止浏览器默认保存saveDocument();}
});
(2)游戏控制
const player = document.getElementById('player');
let position = 0;document.addEventListener('keydown', (event) => {if (event.key === 'd') {position += 10;player.style.left = `${position}px`;}
});
(3)表单输入过滤
const numberInput = document.getElementById('age');numberInput.addEventListener('keydown', (event) => {// 只允许数字、Backspace、Delete 等const allowedKeys = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Backspace', 'Delete', 'ArrowLeft', 'ArrowRight'];if (!allowedKeys.includes(event.key)) {event.preventDefault(); // 阻止非数字输入}
});
按键类型key 值示例code 值示例
字母键'A', 'B', 'a', 'b''KeyA', 'KeyB'
数字键'1', '2''Digit1', 'Digit2'
方向键'ArrowUp', 'ArrowDown''ArrowUp', 'ArrowDown'
功能键'Enter', 'Escape''Enter', 'Escape'
修饰键'Control', 'Shift''ControlLeft', 'ShiftRight'
事件类型触发时机典型应用
keydown按下任意键快捷键、游戏控制、输入过滤
keyup释放任意键获取最终输入结果
keypress按下可打印字符键已逐渐被弃用,推荐使用 keydown

六.文本事件

1. 核心文本事件

(1)输入事件
  • input:元素内容改变时触发(实时监听,包括键盘输入、粘贴、拖放等)。
  • change:元素失去焦点且内容已改变时触发(常用于表单控件)。
(2)组合输入事件(处理输入法)
  • compositionstart:开始输入法组合(如输入中文拼音时)。
  • compositionupdate:输入法组合过程中。
  • compositionend:输入法组合结束(生成最终文本)。
(3)选择事件
  • select:文本被选中时触发(仅适用于文本框、文本区域等)。

2. 示例

(1)实时输入监听
const input = document.getElementById('message');input.addEventListener('input', (event) => {const value = event.target.value;console.log('当前输入:', value);// 实时字数统计document.getElementById('counter').textContent = `${value.length}/140`;
});
(2)组合输入处理
let isComposing = false;input.addEventListener('compositionstart', () => {isComposing = true;
});input.addEventListener('compositionend', (event) => {isComposing = false;console.log('组合输入完成:', event.data);
});// 避免在输入法组合过程中触发逻辑
input.addEventListener('input', (event) => {if (!isComposing) {processInput(event.target.value);}
});
(3)文本选择监听
const textarea = document.getElementById('editor');textarea.addEventListener('select', () => {const selection = textarea.value.substring(textarea.selectionStart,textarea.selectionEnd);console.log('选中的文本:', selection);
});

3. 应用场景

(1)实时搜索建议
const searchInput = document.getElementById('search');searchInput.addEventListener('input', (event) => {const query = event.target.value;if (query.length > 2) {fetchSuggestions(query);}
});
(2)表单验证
const emailInput = document.getElementById('email');emailInput.addEventListener('input', (event) => {const isValid = validateEmail(event.target.value);if (isValid) {emailInput.classList.remove('error');} else {emailInput.classList.add('error');}
});
(3)富文本编辑器
const editor = document.getElementById('rich-editor');editor.addEventListener('input', () => {// 实时保存草稿saveDraft(editor.innerHTML);
});editor.addEventListener('select', () => {// 更新格式工具栏状态updateToolbarState();
});
事件名触发时机典型应用
input内容实时变化实时搜索、字数统计、表单验证
change失去焦点且内容已改变表单提交前的最终验证
compositionstart开始输入法组合输入法状态管理
compositionend输入法组合结束处理非直接输入的最终结果
select文本被选中富文本编辑器格式工具栏

在前端开发中,事件对象(Event Object) 是 JavaScript 在触发事件时自动创建的对象,它包含了与事件相关的所有信息(如事件类型、触发位置、按键状态等)。以下是事件对象的核心概念、常见属性及应用场景:

1. 事件对象的获取

当事件监听器被触发时,JavaScript 会自动传递一个事件对象(通常命名为 evente)给回调函数:

document.addEventListener('click', (event) => {console.log('事件对象:', event);
});

2. 核心属性

(1)事件类型与目标
  • type:事件类型(如 'click''keydown')。
  • target:触发事件的最内层元素(如点击的按钮)。
  • currentTarget:绑定事件监听器的元素(可能是父元素)。
(2)位置信息
  • 鼠标事件

    • clientXclientY:相对于浏览器视口的坐标。
    • pageXpageY:相对于文档的坐标(包含滚动距离)。
    • screenXscreenY:相对于屏幕的坐标。
  • 键盘事件

    • key:按下的键(如 'Enter''A')。
    • code:按键的物理位置(如 'KeyA''Enter')。
(3)修饰键状态
  • ctrlKeyshiftKeyaltKeymetaKey:是否按下对应修饰键(如 Ctrl+C)。
(4)其他属性
  • preventDefault():阻止事件的默认行为(如阻止表单提交、链接跳转)。
  • stopPropagation():阻止事件冒泡到父元素。
  • stopImmediatePropagation():阻止事件冒泡并取消同元素后续相同类型事件的监听。

3. 应用场景

(1)事件委托

利用 target 属性在父元素监听子元素事件:

document.getElementById('parent').addEventListener('click', (event) => {if (event.target.classList.contains('child')) {console.log('子元素被点击:', event.target.textContent);}
});
(2)阻止默认行为
// 阻止表单提交
document.getElementById('form').addEventListener('submit', (event) => {event.preventDefault(); // 阻止表单默认提交handleFormSubmit();
});// 阻止右键菜单
document.addEventListener('contextmenu', (event) => {event.preventDefault(); // 阻止浏览器默认右键菜单showCustomMenu();
});
(3)鼠标位置跟踪
document.addEventListener('mousemove', (event) => {console.log(`鼠标位置: (${event.clientX}, ${event.clientY})`);
});
(4)键盘快捷键
document.addEventListener('keydown', (event) => {// Ctrl+S 保存if (event.ctrlKey && event.key === 's') {event.preventDefault(); // 阻止浏览器默认保存saveDocument();}
});

5. 事件对象的类型

不同类型的事件会创建不同的事件对象,常见的有:

事件类型事件对象类核心属性示例
鼠标事件MouseEventclientX, button, target
键盘事件KeyboardEventkey, code, ctrlKey
输入事件InputEventdata, inputType, target
触摸事件TouchEventtouches, changedTouches
滚动事件WheelEventdeltaX, deltaY

总结

  1. 获取事件详情:如鼠标位置、按键信息。
  2. 控制事件行为:阻止默认行为、停止冒泡。
  3. 实现复杂交互:如事件委托、组合键检测。
http://www.dtcms.com/a/291156.html

相关文章:

  • 耐达讯RS232转Ethercat网关:建筑驱动连接的“秘密武器”
  • 【系统全面】Socket编程——基础知识介绍
  • 2x2矩阵教程
  • AI赋能中医传承:智慧医疗新时代解决方案
  • 如何避免redis分布式锁失效
  • 搭建前端页面,介绍对应标签
  • 前端之学习后端java小白(一)之SDKMAN
  • Typecho目录树插件开发:从后端解析到前端渲染全流程
  • AI革命带来的便利
  • [特殊字符] Java反射从入门到飞升:手撕类结构,动态解析一切![特殊字符]
  • 多线程--线程池
  • 【docker】分享一个好用的docker镜像国内站点
  • dev tools的使用
  • FastMCP全篇教程以及解决400 Bad Request和session termination的问题
  • 理解向量及其运算-AI云计算数值分析和代码验证
  • 微店关键词搜索接口深度开发指南
  • 《探索Go语言:云时代的编程新宠》
  • 【WinMerge】怎么一键查找两个文件的内容不同之处? 用它支持一键批量对比!速度贼快~
  • iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
  • 关于 Python 的踩坑记录
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——0. 博客系列大纲
  • 多片RFSoC同步,64T 64R
  • (Python模块)Python 的进阶工具:sys模块、os模块 与 logging 模块
  • 通过TPLink路由器进行用户行为审计实战
  • tcpdump 命令解析(随手记)
  • Vue过度与动画效果
  • 【Linux】重生之从零开始学习运维之Mysql安装
  • GNU Radio多类信号多种参数数据集生成技巧
  • 【Spring AI】Advisors API—顾问(即拦截器)
  • 信号量demo