使用 jQuery 在 Android 上确定长按(长按、按住)

Posted

技术标签:

【中文标题】使用 jQuery 在 Android 上确定长按(长按、按住)【英文标题】:Determining Long Tap (Long Press, Tap Hold) on Android with jQuery 【发布时间】:2011-01-17 04:51:23 【问题描述】:

我已经能够使用 jQuery 和 html 页面在 android 上通过 touchstart、touchmove 和 touchend 事件successfully play。现在我想看看确定一个长按事件的诀窍是什么,一个人轻按并保持 3 秒。我似乎还无法弄清楚这一点。我想在没有 Sencha Touch、JQTouch、jQMobile 等的情况下纯粹在 jQuery 中实现。

我喜欢 jQTouch 的概念,尽管它并没有为我提供很多东西,而且我的一些代码也与它发生了冲突。使用 Sencha Touch,我不喜欢从 jQuery 迁移到 Ext.js 和一些新的 javascript 抽象方法,尤其是当 jQuery 如此强大时。所以,我想单独用 jQuery 来解决这个问题。我已经能够使用 jQuery 自己做很多 jQTouch 和 Sencha Touch 的事情了。而 jQMobile 仍然是测试版,还不足以支持 Android。

【问题讨论】:

【参考方案1】:

计时器未使用,但只有在用户长按手指后松开手指后才会触发。

var startTime, endTime;
var gbMove = false;

window.addEventListener('touchstart',function(event) 
    startTime = new Date().getTime(); 
    gbMove = false;        
,false);

window.addEventListener('touchmove',function(event) 
  gbMove = true;
,false);

window.addEventListener('touchend',function(event) 
    endTime = new Date().getTime();
    if(!gbMove && (endTime-startTime)/1000 > 2)
        alert('tap hold event');      
,false);

【讨论】:

【参考方案2】:
var gnStartTime = 0;
var gbMove = false;
var gbStillTouching = false;

function checkTapHold(nID) 
  if ((!gbMove) && (gbStillTouching) && (gnStartTime == nID)) 
    gnStartTime = 0;
    gbMove = false; 
    alert('tap hold event');    
  


window.addEventListener('touchstart',function(event) 
  gbMove = false;
  gbStillTouching = true;
  gnStartTime = Number(new Date());
  setTimeout('checkTapHold(' + gnStartTime + ');',2000);
,false);

window.addEventListener('touchmove',function(event) 
  gbMove = true;
,false);

window.addEventListener('touchend',function(event) 
  gbStillTouching = false;
,false);

【讨论】:

【参考方案3】:

为什么不直接使用 js 计时器呢?我做了类似的事情:

i=0;
$drink = document.getElementById('drink');
$drink.addEventListener('touchstart',function(event)
    $('#drink .mainBtnText').text('HOLD'); //mostly for debugging
    t = window.setInterval(function(event)
            i+=.5;
            if (i>=1)
                alert('taphold');
                window.clearInterval(t);
                i=0;
            
        ,500);
);
$drink.addEventListener('touchend',function(event)
    $('#drink .mainBtnText').text('Drink');
    i=0;
    window.clearInterval(t);
);

到目前为止,我绝对没有遇到任何问题......诚然,我还没有进行非常广泛的设备测试,但它可以在我的桌面(使用 mousedown/mouseup)以及 HTC Droid Eris( Android 1.6) 和我的 Droid RAZR (Android 2.3)...

【讨论】:

奇怪的是,它在 touchmove/starting 或 end 在不同的地方表现得很好。不太清楚为什么要这样做,但我也没有抱怨:P【参考方案4】:

我做了这样的事情:

var touchCounter;

window.addEventListener('touchstart', function () 
  var count = 0;
  touchCounter = setInterval(function () 
    count++;
    if (count == 10) alert('touch lasted 10 seconds');
  , 1000);
);

window.addEventListener('touchend', function () 
  clearInterval(touchCounter);
  touchCounter = null;
);

【讨论】:

【参考方案5】:

虽然它不是 jQuery,但我已经在我的 Android 应用程序中这样做了:

    注册的事件监听器:

    var touchStartTimeStamp = 0;
    var touchEndTimeStamp   = 0;
    
    window.addEventListener('touchstart', onTouchStart,false);
    window.addEventListener('touchend', onTouchEnd,false);
    

    新增功能:

    var timer;
    function onTouchStart(e) 
        touchStartTimeStamp = e.timeStamp;
    
    
    function onTouchEnd(e) 
        touchEndTimeStamp = e.timeStamp;
    
        console.log(touchEndTimeStamp - touchStartTimeStamp);// in miliseconds
    
    

    检查时差并完成我的工作

我希望这会有所帮助。

【讨论】:

以上是关于使用 jQuery 在 Android 上确定长按(长按、按住)的主要内容,如果未能解决你的问题,请参考以下文章

使用 touch.tapCount 确定按钮上的长按

使用 ng-click 或 jquery 检测平板电脑上的长按

如何在android中实现长按屏幕?

如何在gridview android上处理事件点击和长按?

android 2.1的源码分析之长按电源键弹出对话框功能修改

Android:长按按钮上的文本