Comment détecter une pression longue touche avec javascript pour android et iphone?

comment détecter une pression longue touche avec javascript pour android et iphone? JavaScript ou jquery natif...

je veux quelque chose qui sonne comme :

<input type='button' onLongTouch='myFunc();' />
23
demandé sur Christophe Debove 2011-05-26 17:26:03

9 réponses

le problème avec L'utilisation de L'extrémité tactile pour détecter le toucher long est qu'il ne fonctionnera pas si vous voulez que l'événement de feu après une certaine période de temps. Il est préférable d'utiliser une minuterie sur la touche de démarrage et désactivez l'événement timer sur la touche de fin. Le modèle suivant peut être utilisé:

var onlongtouch; 
var timer;
var touchduration = 500; //length of time we want the user to touch before we do something

touchstart() {
    timer = setTimeout(onlongtouch, touchduration); 
}

touchend() {

    //stops short touches from firing the event
    if (timer)
        clearTimeout(timer); // clearTimeout, not cleartimeout..
}

onlongtouch = function() { //do something };
32
répondu Joshua 2014-08-07 15:09:06

j'ai ajouté une variable nommée 'lockTimer' qui devrait verrouiller tous les touchstarts supplémentaires avant que l'utilisateur ne déclenche "touchend".

var onlongtouch; 
var timer, lockTimer;
var touchduration = 800; //length of time we want the user to touch before we do something

function touchstart(e) {
	e.preventDefault();
	if(lockTimer){
		return;
	}
    timer = setTimeout(onlongtouch, touchduration); 
	lockTimer = true;
}

function touchend() {
    //stops short touches from firing the event
    if (timer){
        clearTimeout(timer); // clearTimeout, not cleartimeout..
		lockTimer = false;
	}
}

onlongtouch = function() { 
	document.getElementById('ping').innerText+='ping\n'; 
};

document.addEventListener("DOMContentLoaded", function(event) { 
  window.addEventListener("touchstart", touchstart, false);
  window.addEventListener("touchend", touchend, false);
});
<div id="ping"></div>
4
répondu SLoN1ck 2015-07-21 09:35:41
http://m14i.wordpress.com/2009/10/25/javascript-touch-and-gesture-events-iphone-and-android/

Utiliser touchstart et touchend pour détecter longue touche de temps donné

2
répondu Pwnna 2011-05-26 13:36:02

nous pouvons calculer le décalage horaire quand le toucher a commencé et quand le toucher s'est terminé. Si la différence de temps calculée dépasse la durée de contact, alors nous utilisons un nom de fonction taphold.

var touchduration = 300; 
var timerInterval;

function timer(interval) {

    interval--;

    if (interval >= 0) {
        timerInterval = setTimeout(function() {
                            timer(interval);
                        });
    } else {
        taphold();
    }

}

function touchstart() {
    timer(touchduration);
}

function touchend() {
    clearTimeout(timerInterval);
}

function taphold(){
    alert("taphold");
}


document.getElementById("xyz").addEventListener('touchstart',touchstart);
document.getElementById("xyz").addEventListener('touchend',touchend);
2
répondu pradeep 2016-08-22 07:37:28

Pour la croix-plate-forme aux développeurs:

Mouseup/bas semblait d'accord sur android - mais pas tous les dispositifs ie (samsung tab4). Ne fonctionne pas du tout sur iOS.

D'autres recherches il semble que cela soit dû à l'élément ayant la sélection et le grossissement natif intercale l'auditeur.

cet écouteur d'événements permet d'ouvrir une image miniature dans un modal bootstrap, si l'utilisateur détient l'image pour 500ms.

il utilise une classe image responsive montrant donc une version plus grande de l'image. Ce morceau de code a été entièrement testé sur iPad/Tab4/TabA/Galaxy4):

var pressTimer;  
$(".thumbnail").on('touchend', function (e) {
   clearTimeout(pressTimer);
}).on('touchstart', function (e) {
   var target = $(e.currentTarget);
   var imagePath = target.find('img').attr('src');
   var title = target.find('.myCaption:visible').first().text();
   $('#dds-modal-title').text(title);
   $('#dds-modal-img').attr('src', imagePath);
   // Set timeout
   pressTimer = window.setTimeout(function () {
      $('#dds-modal').modal('show');
   }, 500)
});
1
répondu tyler_mitchell 2015-10-23 13:21:48

je l'ai fait de cette façon dans mon application Android:

  1. events registered listeners:

    var touchStartTimeStamp = 0;
    var touchEndTimeStamp   = 0;
    
    window.addEventListener('touchstart', onTouchStart,false);
    window.addEventListener('touchend', onTouchEnd,false);
    
  2. ajout de fonctions:

    var timer;
    function onTouchStart(e) {
        touchStartTimeStamp = e.timeStamp;
    }
    
    function onTouchEnd(e) {
        touchEndTimeStamp = e.timeStamp;
    
        console.log(touchEndTimeStamp - touchStartTimeStamp);// in miliseconds
    }
    
  3. vérifié le décalage horaire et fait mes trucs

j'espère que cela aidera.

1
répondu Strabek 2017-01-03 12:30:11

clic Long de l'événement qui travaillent dans tous les navigateurs

(function (a) {
        function n(b) { a.each("touchstart touchmove touchend touchcancel".split(/ /), function (d, e) { b.addEventListener(e, function () { a(b).trigger(e) }, false) }); return a(b) } function j(b) { function d() { a(e).data(h, true); b.type = f; jQuery.event.handle.apply(e, o) } if (!a(this).data(g)) { var e = this, o = arguments; a(this).data(h, false).data(g, setTimeout(d, a(this).data(i) || a.longclick.duration)) } } function k() { a(this).data(g, clearTimeout(a(this).data(g)) || null) } function l(b) {
            if (a(this).data(h)) return b.stopImmediatePropagation() ||
            false
        } var p = a.fn.click; a.fn.click = function (b, d) { if (!d) return p.apply(this, arguments); return a(this).data(i, b || null).bind(f, d) }; a.fn.longclick = function () { var b = [].splice.call(arguments, 0), d = b.pop(); b = b.pop(); var e = a(this).data(i, b || null); return d ? e.click(b, d) : e.trigger(f) }; a.longclick = { duration: 500 }; a.event.special.longclick = {
            setup: function () {
                /iphone|ipad|ipod/i.test(navigator.userAgent) ? n(this).bind(q, j).bind([r, s, t].join(" "), k).bind(m, l).css({ WebkitUserSelect: "none" }) : a(this).bind(u, j).bind([v,
                w, x, y].join(" "), k).bind(m, l)
            }, teardown: function () { a(this).unbind(c) }
        }; var f = "longclick", c = "." + f, u = "mousedown" + c, m = "click" + c, v = "mousemove" + c, w = "mouseup" + c, x = "mouseout" + c, y = "contextmenu" + c, q = "touchstart" + c, r = "touchend" + c, s = "touchmove" + c, t = "touchcancel" + c, i = "duration" + c, g = "timer" + c, h = "fired" + c
    })(jQuery);

Bind longclick événement avec l'intervalle de temps

 $('element').longclick(250, longClickHandler);

ci-dessous fonction feu sur le long robinet sur l'appareil tactile

function longClickHandler() {
    alter('Long tap Fired');
}
-1
répondu Pradip Talaviya 2017-03-24 04:03:16

le " long touch pressure "est appelé" press " et il est mis en œuvre dans le marteau.js http://hammerjs.github.io/ Essayez leurs démos.

-2
répondu Konstantin Komelin 2016-12-01 11:45:15

j'ai essayé, c'est difficile à faire. Je n'ai pas encore été prêt à adopter un grand cadre mobile pour mes applications, mais si vous êtes D'accord avec cela, Sencha Touch est supposé supporter ceci et d'autres évènements touch sur les périphériques webkit.

dans mes tests avec touchstart, Je ne peux pas empêcher le navigateur mobile d'ouvrir une boîte de dialogue au lieu de déclencher mon événement.

-3
répondu newz2000 2011-06-08 21:13:20