js长按事件

本文详细介绍了如何在HTML中使用JavaScript实现长按事件,通过设置定时器和触摸事件监听,区分点击与长按操作,适用于移动端网页应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
<title>长按</title>  
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1" />  
<meta name="apple-touch-fullscreen" content="yes">  
<meta name="apple-mobile-web-app-capable" content="yes" />  
<link href="css/travelstyle.css" rel="stylesheet" type="text/css" />  
  
</head>  
<body id="body_id" >  
<div style="width:100%;">  
<div style="width:100%; height:100px; background-color:#CCC;" ontouchstart="gtouchstart()" ontouchmove="gtouchmove()" ontouchend="gtouchend()">长按我</div>   
</div>  
<script>  
var timeOutEvent=0;//定时器   
//开始按   
function gtouchstart(){   
    timeOutEvent = setTimeout("longPress()",500);//这里设置定时器,定义长按500毫秒触发长按事件,时间可以自己改,个人感觉500毫秒非常合适   
    return false;   
};   
//手释放,如果在500毫秒内就释放,则取消长按事件,此时可以执行onclick应该执行的事件   
function gtouchend(){   
    clearTimeout(timeOutEvent);//清除定时器   
    if(timeOutEvent!=0){   
        //这里写要执行的内容(尤如onclick事件)   
        alert("你这是点击,不是长按");   
    }   
    return false;   
};   
//如果手指有移动,则取消所有事件,此时说明用户只是要移动而不是长按   
function gtouchmove(){   
    clearTimeout(timeOutEvent);//清除定时器   
    timeOutEvent = 0;   
      
};   
   
//真正长按后应该执行的内容   
function longPress(){   
    timeOutEvent = 0;   
    //执行长按要执行的内容,如弹出菜单   
    alert("长按事件触发发");   
}   
  
</script>  
</body>  
</html>

 

<think>我们参考用户提供的引用内容,特别是引用[1]和引用[2]中关于事件的实现方法。在移动端,事件通常通过`touchstart`、`touchmove`和`touchend`事件组合来实现。基本思路是:1.在`touchstart`事件中设置一个定时器,设定一个时间阈值(如500ms)。2.如果在时间阈值内触发了`touchmove`事件,则清除定时器(因为移动手指通常不算按)。3.如果在时间阈值内触发了`touchend`事件,则清除定时器(说明用户提前松手,不算按)。4.如果定时器成功触发,则执行按回调函数。同时,我们还需要注意一些细节:-防止按时触发浏览器的默认行为(如弹出菜单),可以通过CSS和JavaScript来禁止。-考虑性能,避免内存泄漏,及时清除定时器。根据引用[1]中的jQuery实现和引用[2]中的原生JavaScript实现,我们可以总结出两种方法。另外,引用[4]提到可以通过CSS禁止按弹出菜单:*{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}以及通过JavaScript禁止上下文菜单:document.oncontextmenu=function(e){e.preventDefault();};下面我们分别用原生JavaScript和jQuery两种方式实现事件。方法一:原生JavaScript实现步骤:1.获取目标元素。2.在目标元素上添加`touchstart`、`touchmove`和`touchend`事件监听。3.定义按时间阈值(如500毫秒)。4.在`touchstart`事件中,设置一个定时器,在阈值时间后触发事件。5.在`touchmove`事件中,清除定时器(因为手指移动了,不算按)。6.在`touchend`事件中,清除定时器(如果定时器还未触发,则清除;如果已经触发,则重置相关变量)。注意:在移动端,我们通常使用触摸事件,但为了兼容PC端调试,也可以同时监听鼠标事件(`mousedown`、`mousemove`、`mouseup`)。方法二:使用jQuery实现类似,只是用jQuery绑定事件。下面我们给出两种实现的代码示例。另外,我们也可以参考引用[3]中的思路,将事件封装成一个可复用的函数或类。同时,为了禁止按弹出菜单,我们需要添加上述CSS和JS代码。具体实现如下:</think>### 在移动端实现 JavaScript 事件的方法 在移动端实现事件的核心思路是通过触摸事件(`touchstart`、`touchmove`、`touchend`)结合定时器来判断用户按压时。以下是几种实现方案: #### 方法一:原生 JavaScript 实现 ```javascript const target = document.getElementById('longPressTarget'); let pressTimer = null; target.addEventListener('touchstart', (e) => { // 设置按时间阈值(500ms) pressTimer = setTimeout(() => { console.log('事件触发'); // 执行按操作 e.preventDefault(); // 阻止默认行为 }, 500); }); target.addEventListener('touchend', () => { clearTimeout(pressTimer); // 清除计时器 }); target.addEventListener('touchmove', () => { clearTimeout(pressTimer); // 手指移动时取消按 }); ``` #### 方法二:jQuery 实现(引用[1]方案优化) ```javascript $('#longPressTarget').on({ touchstart: function(e) { // 设置400ms按阈值 this.pressTimer = setTimeout(() => { console.log('按触发'); // 执行按操作 }, 400); }, touchmove: function() { clearTimeout(this.pressTimer); // 移动时取消 }, touchend: function() { clearTimeout(this.pressTimer); // 松开时取消 } }); ``` #### 方法三:封装可复用组件(引用[3]方案) ```javascript class LongPressDetector { constructor(element, callback, delay = 500) { this.element = element; this.callback = callback; this.delay = delay; this.timer = null; this.initEvents(); } initEvents() { this.element.addEventListener('touchstart', this.start.bind(this)); this.element.addEventListener('touchend', this.cancel.bind(this)); this.element.addEventListener('touchmove', this.cancel.bind(this)); } start(e) { this.timer = setTimeout(() => { this.callback(e); }, this.delay); } cancel() { clearTimeout(this.timer); } } // 使用示例 const btn = document.getElementById('myButton'); new LongPressDetector(btn, (e) => { console.log('事件触发', e); }); ``` #### 关键注意事项: 1. **禁用浏览器默认菜单**(引用[4]方案): ```css * { -webkit-touch-callout: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } ``` ```javascript document.addEventListener('contextmenu', e => e.preventDefault()); ``` 2. **时间阈值选择**: - 常规按:500ms - 重要操作:800-1000ms(防止误触) - 即时响应:300ms(接近点击事件) 3. **性能优化**: ```javascript // 事件委托优化(适用于动态元素) document.body.addEventListener('touchstart', (e) => { if(e.target.matches('.long-press')) { // 启动按检测 } }); ``` 4. **移动检测处理**: - 添加 `touchmove` 事件清除逻辑,避免轻微移动触发按 - 设置移动阈值(如5px内不取消按) **完整示例**: ```html <!DOCTYPE html> <html> <head> <style> .long-press-area { width: 200px; height: 200px; background: #eee; display: flex; align-items: center; justify-content: center; } * { -webkit-touch-callout: none; user-select: none; } </style> </head> <body> <div id="pressArea" class="long-press-area"> 按我(500ms) </div> <script> const area = document.getElementById('pressArea'); let pressTimer; area.addEventListener('touchstart', (e) => { pressTimer = setTimeout(() => { area.style.background = '#4CAF50'; area.textContent = '按成功!'; }, 500); }); area.addEventListener('touchend', () => { clearTimeout(pressTimer); area.style.background = '#eee'; area.textContent = '按我(500ms)'; }); area.addEventListener('touchmove', () => clearTimeout(pressTimer)); document.addEventListener('contextmenu', e => e.preventDefault()); </script> </body> </html> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值