J'ai créé une petite application Web HTML5 pour mon entreprise.
Cette application affiche une liste d'éléments et tout fonctionne correctement.
L'application est principalement utilisée sur les téléphones Android et Chrome comme navigateur. De plus, le site est enregistré sur l'écran d'accueil afin qu'Android gère le tout comme une application (en utilisant une WebView je suppose ).
Chrome Beta (et je pense également que le système Android WebView) a introduit une fonctionnalité "dérouler pour actualiser" ( voir ce lien par exemple ).
C'est une fonctionnalité pratique mais je me demandais si elle pouvait être désactivée avec une balise meta (ou des trucs javascript) car l'actualisation peut être facilement déclenchée par l'utilisateur lors de la navigation dans la liste et l'ensemble de l'application est rechargée.
Il s'agit également d'une fonctionnalité non requise par l'application.
Je sais que cette fonctionnalité n'est toujours disponible que dans la version bêta de Chrome, mais j'ai la sensation qu'elle atterrit également sur l'application stable.
Je vous remercie!
Edit: j'ai désinstallé Chrome Beta et le lien épinglé à l'écran d'accueil s'ouvre maintenant avec la version stable de Chrome. Ainsi, les liens épinglés commencent par Chrome et non par une vue Web.
Edit: aujourd'hui (2015-03-19), le menu déroulant pour actualiser est arrivé au chrome stable.
Edit: de @Evyn answer, je suis ce lien et j'ai ce code javascript / jquery qui fonctionne.
Comme l'a souligné @bcintegrity, j'espère une solution de manifeste de site (et / ou une balise meta) dans le futur.
De plus, les suggestions pour le code ci-dessus sont les bienvenues.
la source
Réponses:
L'action par défaut de l'effet pull-to-refresh peut être efficacement empêchée en effectuant l'une des opérations suivantes:
preventDefault
'ing une partie de la séquence tactile, y compris l'un des éléments suivants (dans l'ordre du plus perturbateur au moins perturbateur):touch-action: none
» aux éléments ciblés tactiles, le cas échéant, désactivation des actions par défaut (y compris pull-to-refresh) de la séquence tactile.overflow-y: hidden
» à l'élément body, en utilisant un div pour le contenu défilant si nécessaire.chrome://flags/#disable-pull-to-refresh-effect
).En savoir plus
la source
Solution simple pour 2019+
Chrome 63 a ajouté une propriété css pour vous aider exactement. Lisez ce guide de Google pour avoir une bonne idée de la façon dont vous pouvez le gérer.
Voici leur TL: DR
Pour le faire fonctionner, tout ce que vous avez à ajouter est ceci dans votre CSS:
Il n'est également pris en charge que par Chrome, Edge et Firefox pour le moment, mais je suis sûr que Safari l'ajoutera bientôt car ils semblent être pleinement intégrés avec les travailleurs des services et l'avenir des PWA.
la source
Pour le moment, vous ne pouvez désactiver cette fonctionnalité que via chrome: // flags / # disable-pull-to-refresh-effect - ouvert directement depuis votre appareil.
Vous pouvez essayer d'attraper des
touchmove
événements, mais les chances sont très minces pour obtenir un résultat acceptable.la source
J'utilise MooTools et j'ai créé une classe pour désactiver l'actualisation sur un élément ciblé, mais l'essentiel est (JS natif):
Tout ce que nous faisons ici est de trouver la direction y du touchmove, et si nous nous déplaçons vers le bas de l'écran et que le défilement cible est à 0, nous arrêtons l'événement. Ainsi, pas de rafraîchissement.
Cela signifie que nous tirons à chaque `` mouvement '', ce qui peut coûter cher, mais c'est la meilleure solution que j'ai trouvée jusqu'à présent ...
la source
scrolltop > 0
, l'événement ne sera pas déclenché. Dans mon implémentation, je lie l'touchmove
événement surtouchstart
, uniquement siscrollTop <= 0
. Je le délie dès que l'utilisateur fait défiler vers le bas (initialY >= e.touches[0].clientY
). Si l'utilisateur fait défiler vers le haut (previousY < e.touches[0].clientY
), j'appellepreventDefault
.Après de nombreuses heures d'essais, cette solution fonctionne pour moi
la source
html{touch-action:pan-down}
AngularJS
Je l'ai désactivé avec succès avec cette directive AngularJS:
Il est prudent d'arrêter de regarder dès que l'utilisateur fait défiler vers le bas, car la pression d'actualisation n'a aucune chance d'être déclenchée.
De même, si
scrolltop > 0
, l'événement ne sera pas déclenché. Dans mon implémentation, je lie l'événement touchmove sur touchstart, uniquement siscrollTop <= 0
. Je le délie dès que l'utilisateur fait défiler vers le bas (initialY >= e.touches[0].clientY
). Si l'utilisateur fait défiler vers le haut (previousY < e.touches[0].clientY
), j'appellepreventDefault()
.Cela nous évite de regarder les événements de défilement inutilement, tout en bloquant le défilement excessif.
jQuery
Si vous utilisez jQuery, c'est l' équivalent non testé .
element
est un élément jQuery:Naturellement, la même chose peut également être obtenue avec du JS pur.
la source
e.originalEvent.touches[0].clientY
pour faire ce travail. Toujours aux prises avec la logique quand pour éviter reload. À l'heure actuelle, il semble empêcher au hasard le défilement vers le haut ... Merci pour l'indice dans la bonne direction!Javascript simple
J'ai implémenté en utilisant javascript standard. Simple et facile à mettre en œuvre. Il suffit de coller et cela fonctionne très bien.
la source
body: {overflow-y:hidden}
astuce d' Evyn ci-dessus .La meilleure solution sur CSS pur:
Voir cette démo: https://jsbin.com/pokusideha/quiet
la source
Tu peux essayer ça
exemple :
https://ebidel.github.io/demos/chatbox.html
doc complet https://developers.google.com/web/updates/2017/11/overscroll-behavior
la source
Je trouve que définir votre corps CSS overflow-y: hidden est le moyen le plus simple. Si vous souhaitez avoir une page d'application défilante, vous pouvez simplement utiliser un conteneur div avec des fonctionnalités de défilement.
la source
Notez que overflow-y n'est pas hérité, vous devez donc le définir sur TOUS les éléments de bloc.
Vous pouvez le faire avec jQuery simplement en:
la source
Depuis quelques semaines, j'ai découvert que la fonction javascript que j'avais utilisée pour désactiver l'action d'actualisation de Chrome ne fonctionnait plus. J'ai fait ceci pour le résoudre:
la source
Solution js pure.
la source
Ce que j'ai fait, c'est ajouter ce qui suit aux événements
touchstart
ettouchend
/touchcancel
:Puisque chrome ne défile pas s'il n'est pas en position scrollY
0
cela empêchera le chrome de tirer pour actualiser.Si cela ne fonctionne toujours pas, essayez également de le faire lorsque la page se charge.
la source
J'ai résolu le problème du déroulement pour actualiser avec ceci:
la source