La désactivation de l'android de google chrome pull-down à la fonctionnalité d'actualisation
J'ai créé une petite application web HTML5 pour mon entreprise.
Cette application affiche une liste d'éléments et tout fonctionne bien.
L'application est principalement utilisé sur les téléphones android et Chrome comme navigateur. Aussi, le site est enregistré sur l'écran d'accueil pour Android de gérer la chose comme une application (à l'aide d'une WebView je suppose).
Chrome Bêta (et je pense aussi que le Système Android WebView) a introduit un "tirez vers le bas pour rafraîchir" fonction (Voir ce lien par exemple).
C'est une fonctionnalité très pratique, mais je me demandais si elle peut être désactivée avec un peu de meta tag (ou javascript choses) parce que l'actualisation peuvent être facilement déclenchées par l'utilisateur lors de la navigation dans la liste et l'ensemble de l'application est rechargé.
Aussi c'est une fonctionnalité qui n'est pas requis par l'application.
je sais que cette fonctionnalité est uniquement disponible en Chrome beta, mais j'ai la sensation que c'est l'atterrissage sur l'application plus stable, aussi.
Merci!
Edit: j'ai désinstallé google Chrome Bêta et le lien épinglé à l'écran d'accueil s'ouvre maintenant avec la stable de Chrome. Ainsi, le épinglé liens commence avec Chrome et pas avec une webview.
Edit: aujourd'hui (2015-03-19) le pull-down-to-refresh est venu à la version stable de chrome.
Edit: a partir de @Evyn réponse j'ai suivi ce lien et a obtenu ce javascript/jquery code du travail.
JS:
var lastTouchY = 0;
var preventPullToRefresh = false;
$('body').on('touchstart', function (e) {
if (e.originalEvent.touches.length != 1) { return; }
lastTouchY = e.originalEvent.touches[0].clientY;
preventPullToRefresh = window.pageYOffset == 0;
});
$('body').on('touchmove', function (e) {
var touchY = e.originalEvent.touches[0].clientY;
var touchYDelta = touchY - lastTouchY;
lastTouchY = touchY;
if (preventPullToRefresh) {
//To suppress pull-to-refresh it is sufficient to preventDefault the first overscrolling touchmove.
preventPullToRefresh = false;
if (touchYDelta > 0) {
e.preventDefault();
return;
}
}
});
Comme @bcintegrity souligné, je l'espère, pour un site de manifeste de la solution (et/ou un méta-tag) dans l'avenir.
En outre des suggestions pour le code ci-dessus sont les bienvenus.
- Ouais c'est vraiment nulle. A été dans le milieu de la forme et défile vers le haut, trop loin et elle renouvelle et tout perdu. C'est un retardé par défaut de la fonctionnalité, je clique sur l'icône Actualiser si je veux actualiser!
- Ce serait bien si cette fonctionnalité peut être désactivée dans mon web du manifeste de l'application. Malheureusement, à chaque page sur mon application web a contenu défilant, il est presque impossible de naviguer sans rafraîchissant. Je suis un peu cochée. :/
- C'est une bonne info. Je déteste les sites web que désactiver l'attraction de la fonction d'actualisation. J'aimerais développer une fonctionnalité permettant de faire du rafraîchissement de travail, indépendamment du contenu de la page.
- Parlant en tant que développeur web, déroulant actualisation est incompatible avec piloté par les données des sites web, il recharge la demande. Il est impossible pour un utilisateur de faire défiler vers le haut d'une page sans rechargement de la page entière. Je suis à 100% favorable de Chrome, j'espère qu'ils supprimer cet anti-fonctionnalité.
- Un autre développeur ici: si vous développez votre application intelligemment, ce ne sera pas un problème si vous utilisez un magasin de données comme Redux puis de synchroniser votre "cohérente" de données avec localstorage. Les données qui doit être actualisé sera alors mise à jour de la perfection et de la forme des entrées, etc persistent, même événements d'actualisation.
- J'ai été confronté moi-même à cette TABLE "fonction"... beaucoup de pages web, de nombreuses formes, un insouciant tirer vers le bas avec mon doigt et de données sur cette page sont perdus! Retarder fonction de l'OMI. Il doit être désactivé par défaut, qui ont besoin d'elle, puis laissez-le code de. Je me demandais par jours pourquoi mes "clients" de temps en temps perdu leurs données sur GC...
Vous devez vous connecter pour publier un commentaire.
L'action par défaut du pull-to-refresh effet peut être prévenue par l'une des méthodes suivantes :
preventDefault
’ing une partie de la touche de la séquence, y compris les suivants (dans l'ordre de la plus perturbante pour les moins perturbatrices):touch-action: none
” pour toucher les éléments cibles, le cas échéant, la désactivation par défaut des actions (y compris les pull-to-refresh) de la touche de la séquence.overflow-y: hidden
” à l'élément de corps, à l'aide d'un div pour le contenu défilant si nécessaire.chrome://flags/#disable-pull-to-refresh-effect
).Voir plus
Solution Simple pour 2019+
Chrome 63 (sortie le 5 décembre 2017) a ajouté une propriété css pour les aider avec cette tâche. Lisez ce guide par Google pour obtenir une bonne idée de la façon dont vous pouvez le manipuler.
Voici leur TL:DR
Pour le faire fonctionner, tout ce que vous avez à ajouter ceci dans votre CSS:
Il est également à seulement pris en charge par Chrome, Edge et Firefox pour le moment, mais je suis sûr que Safari ajoutera bientôt comme ils semblent l'être pleinement à bord avec le service des travailleurs et de l'avenir de la PWA.
Pour le moment vous ne pouvez désactiver cette fonction via chrome://flags/#disable-pull-to-refresh-effet - ouvrir directement à partir de votre appareil.
Vous pouvez essayer de l'attraper
touchmove
événements, mais les chances sont très minces pour parvenir à un résultat acceptable.J'utilise MooTools, et j'ai créé une Classe pour désactiver l'actualisation sur un élément ciblé, mais l'essentiel de il est natif " (JS):
Tout ce que nous faisons ici est de trouver la direction y de la touchmove, et si nous nous dirigeons vers le bas de l'écran et la cible de défilement est de 0, nous nous arrêtons à l'événement. Donc, pas de rafraichissement.
Cela signifie que nous progressons chaque "mouvement", qui peut être coûteux, mais c'est la meilleure solution que j'ai trouvé pour l'instant ...
scrolltop > 0
, l'événement ne sera pas déclenché. Dans mon application, je la lie de latouchmove
événement surtouchstart
, seulement siscrollTop <= 0
. Je unbind dès que l'utilisateur fait défiler (initialY >= e.touches[0].clientY
). Si l'utilisateur fait défiler jusqu' (previousY < e.touches[0].clientY
), puis j'appellepreventDefault
.AngularJS
J'ai désactivé correctement avec cette AngularJS directive:
Il est sûr d'arrêter de le regarder dès que l'utilisateur fait défiler vers le bas, comme le canapé pour se rafraîchir 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 application, je la lie de la touchmove événement sur les évènements touchstart, seulement siscrollTop <= 0
. Je unbind dès que l'utilisateur fait défiler (initialY >= e.touches[0].clientY
). Si l'utilisateur fait défiler jusqu' (previousY < e.touches[0].clientY
), puis j'appellepreventDefault()
.Ce qui nous sauve, en regardant les événements de défilement inutilement, mais les blocs de overscrolling.
jQuery
Si vous utilisez jQuery, c'est le non testé équivalent.
element
est un élément jQuery:Naturellement, la même chose peut également être réalisé avec de la pure JS.
e.originalEvent.touches[0].clientY
pour faire ce travail. Encore du mal avec la logique de si pour éviter de recharger. Pour l'instant il semble au hasard empêcher de défiler ... Mettre merci pour l'astuce dans la bonne direction!Après de nombreuses heures de l'essayer, cette solution fonctionne pour moi
html{touch-action:pan-down}
Javascript Simple
J'ai mis en place à l'aide de javascript standard. Simple et facile à mettre en œuvre. Il suffit de coller et il fonctionne très bien.
body: {overflow-y:hidden}
truc de Evyn ci-dessus.La meilleure solution sur pur CSS:
Voir cette démo: https://jsbin.com/pokusideha/quiet
Je trouve le réglage de votre corps CSS overflow-y:hidden est la façon la plus simple. Si vous ne voulez avoir un défilement de page de l'application, vous pouvez simplement utiliser un div conteneur avec défilement de fonctionnalités.
Depuis une couple de semaines, j'ai découvert que la fonction javascript que j'ai utilisé pour désactiver le Chrome actualiser action ne fonctionne plus. J'ai fait cela pour le résoudre:
JS:
HTML:
Noter que overflow-y n'est pas héréditaire, de sorte que vous besoin de le mettre sur TOUS les éléments de bloc.
Vous pouvez le faire avec jQuery simplement par:
Ce que j'ai fait était ajoutez ce qui suit à la
touchstart
ettouchend
/touchcancel
événements:Depuis chrome ne défile pas, si ce n'est pas sur scrollY position
0
cela permettra d'éviter chrome de faire tirer pour rafraîchir.Si elle ne fonctionne toujours pas, essayez aussi de faire que lorsque la page se charge.
Pur js solution.