Определение долгого нажатия (долгое нажатие, удержание нажатия) на Android с помощью jQuery
Мне удалось успешно поиграть с событиями touchstart, touchmove и touchend на Android с помощью jQuery и HTML-страницы. Теперь я пытаюсь понять, в чем заключается хитрость, чтобы определить длинное событие касания, когда одно нажатие и удерживание в течение 3 секунд. Я пока не могу понять это. Я хочу этого исключительно в jQuery без Sencha Touch, JQTouch, jQMobile и т. Д.
Мне нравится концепция jQTouch, хотя она не дает мне много, и часть моего кода ломается. С Sencha Touch я не фанат перехода от jQuery к Ext.js и некоторого нового способа создания абстракции Javascript, особенно когда jQuery настолько способен. Итак, я хочу выяснить это только с помощью jQuery. Я был в состоянии сделать много вещей jQTouch и Sencha Touch самостоятельно, используя jQuery. И jQMobile все еще слишком бета и еще недостаточно ориентирован на Android.
5 ответов
Таймеры не используются, но срабатывают только после того, как пользователь отпустит палец после долгого нажатия.
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);
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);
Я сделал что-то вроде этого:
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;
});
Хотя это не 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 }
проверил разницу во времени и сделал мои вещи
Я надеюсь, это поможет.
Почему бы просто не использовать таймер 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)...