2017-09-13 5 views
9

Il existe de nombreux plugins "pull to refresh". J'ai déjà testé 5 d'entre eux. Mais aucun d'eux ne tourne vite (surtout sur les vieux smartphones).Comment détecter Tirer pour rafraîchir

Quelle est la meilleure façon (performance et réactivité de l'UX au beurrateur) de vérifier si l'actualisation est effectuée? PS: Je n'ai pas besoin d'animation.

PS: Je n'ai pas besoin d'animation. Je veux juste reconnaître si un utilisateur « tirer pour rafraîchir »

+0

'ne sont pas en cours d'exécution fast' dans quel sens? ne tirez pas assez souvent? la traction prend trop de temps? si ce dernier, les chances sont le matériel est le problème –

+0

Il saute toujours un peu. Pas 100% sentiment natif. – Peter

+0

si vous voulez, ne pas entrer dans une grande partie du code, vous pouvez mettre en œuvre balayez geste listner – GeekWithGlasses

Répondre

4

Performance nécessite un minimum de code

Plugins et les bibliothèques doivent être pour être aussi flexible et générale que possible, afin de résoudre de nombreux problèmes connexes. Cela signifie qu'ils seront toujours plus volumineux que nécessaire, ce qui aura une incidence sur les performances. Cela signifie également que vous n'aurez jamais à maintenir ce code. C'est le compromis.

Si la performance est votre objectif, construisez-le vous-même.

Puisque TOUT ce dont vous avez besoin est une détection par pull-down, construisez un simple détecteur de balayage. Bien sûr, vous devrez l'adapter à vos besoins et aux propriétés de l'événement, aux déclencheurs d'événements du système d'exploitation et du navigateur que vous ciblez.

simplifié de mon ancien js-minimal-swipe-detect

var pStart = {x: 0, y:0}; 
var pStop = {x:0, y:0}; 

function swipeStart(e) { 
    if (typeof e['targetTouches'] !== "undefined"){ 
     var touch = e.targetTouches[0]; 
     pStart.x = touch.screenX; 
     pStart.y = touch.screenY; 
    } else { 
     pStart.x = e.screenX; 
     pStart.y = e.screenY; 
    } 
} 

function swipeEnd(e){ 
    if (typeof e['changedTouches'] !== "undefined"){ 
     var touch = e.changedTouches[0]; 
     pStop.x = touch.screenX; 
     pStop.y = touch.screenY; 
    } else { 
     pStop.x = e.screenX; 
     pStop.y = e.screenY; 
    } 

    swipeCheck(); 
} 

function swipeCheck(){ 
    var changeY = pStart.y - pStop.y; 
    var changeX = pStart.x - pStop.x; 
    if (isPullDown(changeY, changeX)) { 
     alert('Swipe Down!'); 
    } 
} 

function isPullDown(dY, dX) { 
    // methods of checking slope, length, direction of line created by swipe action 
    return dY < 0 && (
     (Math.abs(dX) <= 100 && Math.abs(dY) >= 300) 
     || (Math.abs(dX)/Math.abs(dY) <= 0.3 && dY >= 60) 
    ); 
} 

document.addEventListener('touchstart', function(e){ swipeStart(e); }, false); 
document.addEventListener('touchend', function(e){ swipeEnd(e); }, false); 
+0

je pense que c'est exactement ce que je cherche im. Mais je reçois une erreur "abs n'est pas défini":/ – Peter

+2

@Peter changer 'abs()' en Math.abs() ' –

+0

@KScandrett, Merci pour cela. Pauvre surveillance de ma part. –

0

avez-vous fatigué ces solutions ?? Vous devez vérifier fiddle

var mouseY = 0; 
var startMouseY = 0; 
$('body').on('mousedown', function (ev) { 
    mouseY = ev.pageY; 
    startMouseY = mouseY; 
    $(document).mousemove(function (e) { 
     if (e.pageY > mouseY) { 
      var d = e.pageY - startMouseY; 
      console.log("d: " + d); 
      if (d >= 200) 
       location.reload(); 
      $('body').css('margin-top', d/4 + 'px'); 
     } 
     else 
      $(document).unbind("mousemove"); 


    }); 
}); 
$('body').on('mouseup', function() { 
    $('body').css('margin-top', '0px'); 
    $(document).unbind("mousemove"); 
}); 
$('body').on('mouseleave', function() { 
    $('body').css('margin-top', '0px'); 
    $(document).unbind("mousemove"); 
}); 

et si vous êtes à la recherche pour certains plug-in this plugin peut vous aider

+0

@ mr-pyramid, la plupart des périphériques mobiles n'enregistrent aucun événement 'souris **' pour le toucher. Cela fonctionnerait bien pour les ordinateurs de bureau et portables, avec ou sans contact, mais ne fonctionnera pas pour les appareils Android, iOS ou WinPhone. –

+0

Votre réponse résout-elle les problèmes pour Android et les appareils mobiles? –

+1

Il devrait fonctionner sur la plupart des appareils mobiles, mais le code original (plus encombrant) à partir duquel j'ai créé cette solution n'a été testé que sur 2 navigateurs: Android, 5 sur PC et 2 sur Mac. Votre solution ne fonctionnera pas avec TOUTES les actions tactiles, ce qui était le problème qu'OP demandait de résoudre. –