JS- 事件监听之防止点击过快

本文介绍了一种在HTML和JavaScript中防止用户快速连续点击按钮的方法。通过使用变量作为开关,确保按钮点击事件只响应一次,直到动画或操作完成。这种方法适用于需要执行耗时操作的情况,避免了因频繁触发相同事件导致的用户体验下降。

HTML+css
在这里插入图片描述
move.js
在这里插入图片描述

<!-- 在body中,调用外部js文件,只要写在调用函数之前就可以 -->
<script src="./move.js"></script>

<script>
    // 阻止点击过快的思路
    // 方法1:禁用
    //   点击时,禁用button
    //   这样的方法,只对button按钮有用
    //   div,span等标签是没有作用的

    // 方法2:判断+return
    //   第一次点击执行 move()函数
    //   之后再点击,执行的是return,终止执行move()函数
    //   当运动终止之后,可以再次点击

    var oDiv = document.querySelector('div');
    var oBtn = document.querySelector('button');


    /*
        // 方法1,禁用方法
    
    
    oBtn.addEventListener('click' , function(){
        // 点击时,给button按钮添加引用属性
        // 当运动停止时,也就是旧的定时器已经清除了
        // 可以再次执行了
        // 参数3,是运动停止后,也就是清除了定时器之后,执行的程序
        //       在参数3的函数中,让 button按钮 , disabled 为 false 
        oBtn.disabled = true;
        // 代用move函数
        move(oDiv , {left:600} , function(){
            oBtn.disabled = false;
            console.log('运动停止了');
        })
    })

    */

    // 定义一个变量,类似于质数判断中的开关变量
    // 赋值原始值
    var bool = true;

    oBtn.addEventListener('click' , function(){
        // 方法1  变量是 原始值true,执行程序
        // if(bool === true){   
        //     // 就执行move()
        //     move(oDiv,{left:600},function(){
        //         // 当运行结束时,给bool,在赋值为true,可以再次点击
        //         bool = true;
        //     });
        //     // 写哪儿无所谓,只要是执行,就给变量赋值其他数值
        //     bool = '其他数值';
        // }


        // 方式2  变量不是原始值true, 执行return,终止之后的函数程序执行
        if(bool !== true){
            // 如果变量中不是原始值,就直接执行return,不再执行之后的程序
            return;
        }
        move(oDiv,{left:600},function(){
            // 当运行结束时,给bool,在赋值为true,可以再次点击
            bool = true;
        });
        bool = '随便写什么';
    })
JavaScript 中,可以通过监听 `keydown`、`keyup` 和 `keypress` 事件来检测用户的键盘输入。最常用的是 `keydown` 和 `keyup`。 - `keydown`: 当用户按下任意键时触发(持续按住会重复触发)。 - `keyup`: 当用户释放一个键时触发。 - `keypress`(已废弃): 仅对可产生字符输入的键有效,**不推荐使用**,已被现代浏览器弃用。 --- ### ✅ 示例:监听键盘按下和释放事件 ```javascript // 监听整个页面的键盘事件 document.addEventListener('keydown', function(event) { console.log('按键被按下:', event.key); // 显示键名,如 'a', 'Enter', 'Shift' console.log('键码:', event.code); // 显示物理键位,如 'KeyA', 'Enter' console.log('是否按下了 Ctrl:', event.ctrlKey); console.log('是否按下了 Alt:', event.altKey); console.log('是否按下了 Shift:', event.shiftKey); // 阻止默认行为(例如,在文本框中输入) // event.preventDefault(); // 可以根据按键执行特定操作 if (event.key === 'Enter') { alert('你按下了回车键!'); } if (event.ctrlKey && event.key === 's') { event.preventDefault(); // 阻止默认保存 alert('Ctrl + S 被按下,自定义保存功能'); } }); document.addEventListener('keyup', function(event) { console.log('按键被释放:', event.key); }); ``` --- ### 🔍 解释说明: - `event.key`: 表示逻辑上的键值,比如按 `Shift+A` 得到 `'A'`,适合语义判断。 - `event.code`: 表示物理按键的位置,比如不管是否按 `Shift`,按 A 键总是返回 `'KeyA'`。 - `event.ctrlKey`, `event.altKey`, `event.shiftKey`: 布尔值,判断修饰键是否同时按下。 - 使用 `addEventListener` 是现代标准做法,避免覆盖其他事件处理函数。 --- ### 🛠️ 实际应用场景举例 #### 案例:监听 ESC 键关闭弹窗 ```javascript document.addEventListener('keydown', function(event) { if (event.key === 'Escape') { const modal = document.getElementById('modal'); if (modal) { modal.style.display = 'none'; } } }); ``` #### 案例:方向键控制元素移动 ```html <div id="player" style="width:50px; height:50px; background:red; position:absolute;"></div> ``` ```javascript const player = document.getElementById('player'); let x = 0, y = 0; document.addEventListener('keydown', function(event) { switch(event.key) { case 'ArrowUp': y -= 10; break; case 'ArrowDown': y += 10; break; case 'ArrowLeft': x -= 10; break; case 'ArrowRight': x += 10; break; default: return; // 不处理其他键 } event.preventDefault(); // 防止页面滚动等默认行为 player.style.left = x + 'px'; player.style.top = y + 'px'; }); ``` --- ### ⚠️ 注意事项 1. **焦点问题**:某些元素(如 `<input>`)获取焦点后,才会触发键盘事件。如果想全局监听,请确保事件绑定在 `document` 或 `window` 上。 2. **防止冲突**:使用 `event.preventDefault()` 谨慎,可能阻止浏览器正常功能(如 Ctrl+S 保存)。 3. **移动端兼容性**:虚拟键盘行为不同,建议结合触摸事件。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值