# 事件处理 PE引擎提供了简洁而强大的事件处理机制,让你能够轻松响应用户的交互操作。事件处理是创建交互式应用的关键部分。 ## 事件绑定语法 在PE的场景模板中,你可以使用`@`前缀直接绑定事件处理器: ```html 点击我 悬停我 按钮1 按钮2 ``` ## 支持的事件类型 PE支持所有标准的DOM事件类型: ### 鼠标事件 ```html 鼠标事件示例 ``` ### 键盘事件 ```html 按键事件示例(点击后按键盘) ``` ### 表单事件 ```html ``` ### 触摸事件 ```html 触摸事件示例 ``` ## 事件对象 所有事件处理器都会接收到一个事件对象,包含有关事件的详细信息: ```javascript function handleClick(event) { // 事件基本信息 console.log('事件类型:', event.type) console.log('目标元素:', event.target) console.log('当前元素:', event.currentTarget) // 鼠标位置 console.log('页面坐标:', event.pageX, event.pageY) console.log('客户端坐标:', event.clientX, event.clientY) // 键盘信息 console.log('是否按下Ctrl键:', event.ctrlKey) console.log('是否按下Alt键:', event.altKey) console.log('是否按下Shift键:', event.shiftKey) // 阻止默认行为 event.preventDefault() // 阻止事件冒泡 event.stopPropagation() } ``` ## 在JavaScript中绑定事件 除了在模板中绑定事件,你也可以在JavaScript代码中直接绑定事件: ```javascript // 获取场景元素 const element = game.getSceneElement('my-button') // 添加事件监听器 element.element.addEventListener('click', function(event) { console.log('元素被点击了') }) // 添加多个事件监听器 element.element.addEventListener('mouseenter', handleMouseEnter) element.element.addEventListener('mouseleave', handleMouseLeave) // 移除事件监听器 element.element.removeEventListener('click', handleClick) ``` ## 事件修饰符 PE支持一些常用的事件修饰符,类似于Vue.js的语法: ```html 阻止默认行为 阻止事件冒泡 只触发一次 阻止冒泡和默认行为 ``` ## 自定义事件 你也可以创建和触发自定义事件: ```javascript // 创建自定义事件 const customEvent = new CustomEvent('myCustomEvent', { detail: { message: '这是自定义事件数据' } }) // 触发自定义事件 element.element.dispatchEvent(customEvent) // 监听自定义事件 element.element.addEventListener('myCustomEvent', function(event) { console.log('接收到自定义事件:', event.detail.message) }) ``` ## 事件总线 PE引擎内置了事件总线,允许你在不同组件间进行通信: ```javascript // 发送事件 game.eventBus.emit('user-login', { username: 'john' }) // 监听事件 game.eventBus.on('user-login', function(data) { console.log('用户登录:', data.username) }) // 移除事件监听器 game.eventBus.off('user-login', handlerFunction) ``` ## 在场景脚本中处理事件 在场景的` ``` ## 事件处理最佳实践 ### 1. 合理使用事件委托 对于大量相似元素,使用事件委托可以提高性能: ```html 项目1 项目2 项目3 ``` ### 2. 及时移除事件监听器 在适当的时机移除事件监听器,避免内存泄漏: ```javascript onLoad(() => { // 添加事件监听器 document.addEventListener('keydown', handleGlobalKeyDown) }) onDestory(() => { // 移除事件监听器 document.removeEventListener('keydown', handleGlobalKeyDown) }) function handleGlobalKeyDown(event) { // 全局键盘事件处理 if (event.key === 'Escape') { PE.navigateTo('/') } } ``` ### 3. 使用防抖和节流 对于频繁触发的事件(如滚动、输入),使用防抖和节流优化性能: ```javascript // 防抖函数 function debounce(func, wait) { let timeout return function(...args) { clearTimeout(timeout) timeout = setTimeout(() => func.apply(this, args), wait) } } // 节流函数 function throttle(func, limit) { let inThrottle return function(...args) { if (!inThrottle) { func.apply(this, args) inThrottle = true setTimeout(() => inThrottle = false, limit) } } } // 使用防抖处理输入事件 const handleInput = debounce(function(event) { console.log('输入内容:', event.target.value) }, 300) // 使用节流处理滚动事件 const handleScroll = throttle(function(event) { console.log('页面滚动') }, 100) ``` ## 完整示例 以下是一个完整的事件处理示例: ### scenes/game/index.pe ```html 开始游戏 暂停 重置 得分: {{ score }} 生命: {{ lives }} ``` 通过以上内容,你已经了解了PE引擎的事件处理机制。在下一章节中,我们将探讨生命周期的相关内容。