js中单击、双击和长按共存方案

在javascript中,如果同时使用单击和双击事件,在双击的时候就会同时出发一次单击事件,在csdn里已经有很多利用jquery解决的办法了,在这里推荐一种同时兼容单击、双击以及长按的原生办法。

fclick

在这里使用到的是一个叫fclick的js库,调用的方法也非常简单,下面是例子

var fc=new fclick(document.getElementsByClassName('block'));
fc.single(function(e){
    //单击
    //e为event元素
    //e.target可以获取被点击的元素
    //e.clientX可以获取鼠标X轴位置,Y轴同理
    console.log("single"+e.clientX);
})
fc.double(function(e){
    //双击
    console.log("double"+e.target.getAttribute("id"));
})
fc.longPress(function(e){
    //长按
    console.log("longPress"+e.target.getAttribute("id"));
})

附上github地址:fclick

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在51单片机,独立按键的驱动可以采用轮询方式或者断方式。下面分别介绍三种按键的驱动方式。 ### 单击按键 #### 轮询方式 在轮询方式,通过不断查询按键的状态来判断是否按下。具体实现如下: ```c // 定义按键IO口和状态 sbit key = P1^0; bit key_state = 0; void main() { while(1) { // 检测按键是否按下 if(key == 0) { // 消抖处理 delay_ms(10); if(key == 0) { key_state = 1; } } else { key_state = 0; } // 判断按键状态,执行相应的操作 if(key_state == 1) { // 执行单击操作 // ... } } } ``` #### 断方式 在断方式,通过外部断触发来判断按键是否按下。具体实现如下: ```c // 定义按键IO口和状态 sbit key = P1^0; bit key_state = 0; // 断服务函数 void key_interrupt() interrupt 0 { // 消抖处理 delay_ms(10); if(key == 0) { key_state = 1; } } void main() { // 配置外部断0 IT0 = 1; EX0 = 1; EA = 1; while(1) { // 判断按键状态,执行相应的操作 if(key_state == 1) { // 执行单击操作 // ... } } } ``` ### 双击按键 双击按键的实现可以通过轮询方式或者定时器方式实现。 #### 轮询方式 在轮询方式,需要记录上一次按键的时间,并通过计算两次按键时间的间隔来判断是否为双击。具体实现如下: ```c // 定义按键IO口和状态 sbit key = P1^0; bit key_state = 0; unsigned int last_key_time = 0; void main() { while(1) { // 检测按键是否按下 if(key == 0) { // 消抖处理 delay_ms(10); if(key == 0) { key_state = 1; } } else { key_state = 0; } // 判断按键状态,执行相应的操作 if(key_state == 1) { if((unsigned int)(get_sys_time() - last_key_time) < 500) { // 执行双击操作 // ... last_key_time = 0; } else { last_key_time = get_sys_time(); } } } } ``` #### 定时器方式 在定时器方式,需要配置定时器,并记录上一次按键的时间。每次检测到按键按下时,通过计算两次按键时间的间隔来判断是否为双击。具体实现如下: ```c // 定义按键IO口和状态 sbit key = P1^0; bit key_state = 0; unsigned int last_key_time = 0; // 定时器0断服务函数 void timer0_interrupt() interrupt 1 { // 定时1ms TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; } void main() { // 配置定时器0 TMOD = 0x01; TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; ET0 = 1; TR0 = 1; EA = 1; while(1) { // 检测按键是否按下 if(key == 0) { // 消抖处理 delay_ms(10); if(key == 0) { key_state = 1; } } else { key_state = 0; } // 判断按键状态,执行相应的操作 if(key_state == 1) { if((unsigned int)(get_sys_time() - last_key_time) < 500) { // 执行双击操作 // ... last_key_time = 0; } else { last_key_time = get_sys_time(); } } } } ``` ### 按按键 按按键的实现可以通过轮询方式、断方式或者定时器方式实现。 #### 轮询方式 在轮询方式,需要记录按键按下的时间,并通过判断按键持续时间的短来判断是否为按。具体实现如下: ```c // 定义按键IO口和状态 sbit key = P1^0; bit key_state = 0; unsigned int key_down_time = 0; void main() { while(1) { // 检测按键是否按下 if(key == 0) { // 消抖处理 delay_ms(10); if(key == 0) { key_state = 1; key_down_time = get_sys_time(); } } else { if(key_state == 1) { if((unsigned int)(get_sys_time() - key_down_time) > 1000) { // 执行按操作 // ... key_state = 0; } else { // 执行单击操作 // ... key_state = 0; } } } } } ``` #### 断方式 在断方式,需要配置外部断,并记录按键按下的时间。每次触发断时,通过判断按键持续时间的短来判断是否为按。具体实现如下: ```c // 定义按键IO口和状态 sbit key = P1^0; bit key_state = 0; unsigned int key_down_time = 0; // 断服务函数 void key_interrupt() interrupt 0 { // 消抖处理 delay_ms(10); if(key == 0) { key_down_time = get_sys_time(); } else { if((unsigned int)(get_sys_time() - key_down_time) > 1000) { // 执行按操作 // ... } else { // 执行单击操作 // ... } } } void main() { // 配置外部断0 IT0 = 1; EX0 = 1; EA = 1; while(1) { } } ``` #### 定时器方式 在定时器方式,需要配置定时器,并记录按键按下的时间。每次检测到按键按下时,通过判断按键持续时间的短来判断是否为按。具体实现如下: ```c // 定义按键IO口和状态 sbit key = P1^0; bit key_state = 0; unsigned int key_down_time = 0; // 定时器0断服务函数 void timer0_interrupt() interrupt 1 { // 定时1ms TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; // 检测按键是否按下 if(key == 0) { // 消抖处理 delay_ms(10); if(key == 0) { key_state = 1; key_down_time = get_sys_time(); } } else { if(key_state == 1) { if((unsigned int)(get_sys_time() - key_down_time) > 1000) { // 执行按操作 // ... key_state = 0; } else { // 执行单击操作 // ... key_state = 0; } } } } void main() { // 配置定时器0 TMOD = 0x01; TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; ET0 = 1; TR0 = 1; EA = 1; while(1) { } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值