H5实现按钮的长按事件
Posted sqtu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H5实现按钮的长按事件相关的知识,希望对你有一定的参考价值。
最近要做一个手机页面,模拟遥控器对硬件设备做控制,有对镜头的上下左右摇动、聚焦等操作。
操作体验要模拟实体遥控器,只是点击一次触发一次的话体验不好,要长按不放的时候也能生效。写出代码如下,测试为了看出效果,写了个 id = tt 的 span,代码如下,只看一部分代码就行,其他三个按钮跟第一个代码基本完全一样:
1 $(function () { 2 3 var timeOutEvent = 0; 4 var si = 0; 5 6 // 向上按钮 7 function shake_up() { 8 // 一次向上摇多少 9 $("#tt").append("上摇5度, "); 10 } 11 12 function always_shake_up() { 13 //如果是按住不放,使用setInterval,每隔多少时间触发一次动作,每过500毫秒向上摇5度 14 si = setInterval(shake_up, 500); 15 } 16 17 $("#move_top").on({ 18 touchstart: function (e) { // 当向上按钮被开始点中时 19 timeOutEvent = setTimeout(always_shake_up, 500); // 使用setTimeout,500毫秒后执行always_shake_up 20 e.preventDefault(); 21 }, 22 touchmove: function () { 23 clearInterval(si); //鼠标或手指从按钮上离开,删除间隔触发的setInterval对象 24 clearTimeout(timeOutEvent); // 清除setTimeout对象 25 si = 0; 26 timeOutEvent = 0; 27 }, 28 touchend: function () { 29 clearInterval(si); 30 clearTimeout(timeOutEvent); 31 if (timeOutEvent != 0) { 32 shake_up(); // timeOutEvent != 0,也就是说没有setTimeout对象,也就是还没到500毫秒就松开了手指,那就识别为一次点击,向上摇5度 33 } 34 return false; 35 } 36 }); 37 38 39 // 向左按钮 40 function shake_left() { 41 $("#tt").append("左摇5度, "); 42 } 43 function always_shake_left() { 44 si = setInterval(shake_left, 500); 45 } 46 47 $("#move_left").on({ 48 touchstart: function (e) { 49 timeOutEvent = setTimeout(always_shake_left, 300); 50 e.preventDefault(); 51 }, 52 touchmove: function () { 53 clearInterval(si); 54 clearTimeout(timeOutEvent); 55 si = 0; 56 timeOutEvent = 0; 57 }, 58 touchend: function () { 59 clearInterval(si); 60 clearTimeout(timeOutEvent); 61 if (timeOutEvent != 0) { 62 shake_left(); 63 } 64 return false; 65 } 66 }); 67 68 // 向右按钮 69 function shake_right() { 70 $("#tt").append("右摇5度, "); 71 } 72 function always_shake_right() { 73 si = setInterval(shake_right, 500); 74 } 75 76 $("#move_right").on({ 77 touchstart: function (e) { 78 timeOutEvent = setTimeout(always_shake_right, 500); 79 e.preventDefault(); 80 }, 81 touchmove: function () { 82 clearInterval(si); 83 clearTimeout(timeOutEvent); 84 si = 0; 85 timeOutEvent = 0; 86 }, 87 touchend: function () { 88 clearInterval(si); 89 clearTimeout(timeOutEvent); 90 if (timeOutEvent != 0) { 91 shake_right(); 92 } 93 return false; 94 } 95 }); 96 97 // 向下按钮 98 function shake_down() { 99 $("#tt").append("下摇5度, "); 100 } 101 function always_shake_down() { 102 si = setInterval(shake_down, 500); 103 } 104 105 $("#move_bottom").on({ 106 touchstart: function (e) { 107 timeOutEvent = setTimeout(always_shake_down, 500); 108 e.preventDefault(); 109 }, 110 touchmove: function () { 111 clearInterval(si); 112 clearTimeout(timeOutEvent); 113 si = 0; 114 timeOutEvent = 0; 115 }, 116 touchend: function () { 117 clearInterval(si); 118 clearTimeout(timeOutEvent); 119 if (timeOutEvent != 0) { 120 shake_down(); 121 } 122 return false; 123 } 124 }); 125 });
最终效果截图就像下面这样:
如果只是快速点击一下,就触发一次动作;长按不放的话,就每隔500ms触发一次动作,一直到放开按钮。
注意:手机大部分浏览器或是手机本身的界面都有长按功能,有的打开一个菜单,有的是对文字进行复制粘贴,跟我们这里自己写的长按功能冲突了。使用下面css和js来禁用原生的长按功能:
1 /*如果是禁用长按选择文字功能,用css*/ 2 * { 3 -webkit-touch-callout: none; 4 -webkit-user-select: none; 5 -khtml-user-select: none; 6 -moz-user-select: none; 7 -ms-user-select: none; 8 user-select: none; 9 }
1 // 如果是想禁用长按弹出菜单, 用js 2 window.addEventListener(‘contextmenu‘, function (e) { 3 e.preventDefault(); 4 });
以上是关于H5实现按钮的长按事件的主要内容,如果未能解决你的问题,请参考以下文章