Ich habe eine kleine HTML5-Webanwendung für mein Unternehmen erstellt.
Diese Anwendung zeigt eine Liste von Elementen an und alles funktioniert einwandfrei.
Die Anwendung wird hauptsächlich auf Android-Handys und Chrome als Browser verwendet. Außerdem wird die Site auf dem Startbildschirm gespeichert, sodass Android das Ganze als App verwaltet ( vermutlich mit einem WebView ).
Chrome Beta (und ich denke auch das Android System WebView) hat eine Funktion zum Herunterziehen zum Aktualisieren eingeführt ( siehe diesen Link zum Beispiel ).
Dies ist eine praktische Funktion, aber ich habe mich gefragt, ob sie mit einem Meta-Tag (oder Javascript-Material) deaktiviert werden kann, da die Aktualisierung vom Benutzer beim Navigieren in der Liste leicht ausgelöst werden kann und die gesamte App neu geladen wird.
Auch dies ist eine Funktion, die von der Anwendung nicht benötigt wird.
Ich weiß, dass diese Funktion nur in Chrome Beta verfügbar ist, aber ich habe das Gefühl, dass dies auch auf der stabilen App landet.
Danke dir!
Bearbeiten: Ich habe Chrome Beta deinstalliert und der Link zum Startbildschirm wird jetzt mit dem stabilen Chrome geöffnet. Die angehefteten Links beginnen also mit Chrome und nicht mit einer Webansicht.
Bearbeiten: Heute (19.03.2015) ist das Pulldown-to-Refresh auf das stabile Chrom gekommen.
Bearbeiten: von @Evyn Antwort Ich folge diesem Link und habe diesen Javascript / JQuery-Code, der funktioniert.
Wie @bcintegrity hervorhob, hoffe ich auf eine Lösung für das Site-Manifest (und / oder ein Meta-Tag) in der Zukunft.
Darüber hinaus sind Vorschläge für den obigen Code willkommen.
quelle
Antworten:
Die Standardaktion des Pull-to-Refresh-Effekts kann effektiv verhindert werden, indem Sie einen der folgenden Schritte ausführen:
preventDefault
einen Teil der Berührungssequenz, einschließlich einer der folgenden (in der Reihenfolge der störendsten bis am wenigsten störenden):touch-action: none
Gegebenenfalls Anwenden von " " auf berührungsbezogene Elemente, Deaktivieren von Standardaktionen (einschließlich Pull-to-Refresh) der Berührungssequenz.overflow-y: hidden
" auf das Körperelement, ggf. Verwenden eines div für scrollbaren Inhalt.chrome://flags/#disable-pull-to-refresh-effect
).Mehr sehen
quelle
Einfache Lösung für 2019+
Chrome 63 hat eine CSS-Eigenschaft hinzugefügt, um genau dies zu unterstützen. Lesen Sie diesen Leitfaden von Google durch , um eine gute Vorstellung davon zu erhalten, wie Sie damit umgehen können.
Hier ist ihre TL: DR
Damit es funktioniert, müssen Sie nur Folgendes in Ihrem CSS hinzufügen:
Es wird derzeit auch nur von Chrome, Edge und Firefox unterstützt , aber ich bin sicher, Safari wird es hinzufügen, sobald sie mit den Servicemitarbeitern und der Zukunft der PWAs voll an Bord zu sein scheinen.
quelle
Momentan können Sie diese Funktion nur über chrome: // flags / # disable-pull-to-refresh-effect deaktivieren - direkt von Ihrem Gerät aus öffnen.
Sie könnten versuchen,
touchmove
Ereignisse zu erfassen , aber die Chancen, ein akzeptables Ergebnis zu erzielen, sind sehr gering.quelle
Ich verwende MooTools und habe eine Klasse erstellt, um die Aktualisierung eines Zielelements zu deaktivieren. Der Kern davon ist jedoch (natives JS):
Alles, was wir hier tun, ist die y-Richtung der Berührungsbewegung zu finden. Wenn wir uns auf dem Bildschirm nach unten bewegen und die Zielrolle 0 ist, stoppen wir das Ereignis. Also keine Auffrischung.
Dies bedeutet, dass wir bei jedem "Zug" schießen, was teuer sein kann, aber die beste Lösung ist, die ich bisher gefunden habe ...
quelle
scrolltop > 0
das Ereignis nicht ausgelöst. In meiner Implementierung binde ich dastouchmove
Ereignistouchstart
nur dann an , wennscrollTop <= 0
. Ich binde die Bindung auf, sobald der Benutzer einen Bildlauf nach unten durchführt (initialY >= e.touches[0].clientY
). Wenn der Benutzer einen Bildlauf durchführt (previousY < e.touches[0].clientY
), rufe ich anpreventDefault
.Nach vielen Stunden des Versuchs funktioniert diese Lösung für mich
quelle
html{touch-action:pan-down}
AngularJS
Ich habe es mit dieser AngularJS-Direktive erfolgreich deaktiviert:
Es ist sicher, die Wiedergabe zu beenden, sobald der Benutzer einen Bildlauf nach unten durchführt, da das Ziehen zum Aktualisieren keine Chance hat, ausgelöst zu werden.
Ebenso wird
scrolltop > 0
das Ereignis nicht ausgelöst. In meiner Implementierung binde ich das touchmove-Ereignis nur dann an touchstart, wennscrollTop <= 0
. Ich binde die Bindung auf, sobald der Benutzer einen Bildlauf nach unten durchführt (initialY >= e.touches[0].clientY
). Wenn der Benutzer einen Bildlauf durchführt (previousY < e.touches[0].clientY
), rufe ich anpreventDefault()
.Dies erspart uns das unnötige Betrachten von Scroll-Ereignissen und blockiert gleichzeitig das Über-Scrollen.
jQuery
Wenn Sie jQuery verwenden, ist dies das nicht getestete Äquivalent.
element
ist ein jQuery-Element:Dasselbe kann natürlich auch mit reinem JS erreicht werden.
quelle
e.originalEvent.touches[0].clientY
, um diese Arbeit zu machen. Ich habe immer noch Probleme mit der Logik, wann ein erneutes Laden verhindert werden soll. Im Moment scheint es zufällig zu verhindern, dass nach oben gescrollt wird ... Danke für den Hinweis in die richtige Richtung!Einfaches Javascript
Ich habe mit Standard-Javascript implementiert. Einfach und leicht zu implementieren. Einfach einfügen und es funktioniert gut.
quelle
body: {overflow-y:hidden}
Trick von Evyn oben benutzt .Die beste Lösung für reines CSS:
Siehe diese Demo: https://jsbin.com/pokusideha/quiet
quelle
Sie können dies versuchen
Beispiel:
https://ebidel.github.io/demos/chatbox.html
vollständiges Dokument https://developers.google.com/web/updates/2017/11/overscroll-behavior
quelle
Ich finde das Einstellen Ihres Körper- CSS- Überlaufs: Versteckt ist der einfachste Weg. Wenn Sie eine Bildlaufanwendungsseite haben möchten, können Sie einfach einen div-Container mit Bildlauffunktionen verwenden.
quelle
Beachten Sie, dass overflow-y nicht vererbt wird. Sie müssen es daher für ALLE Blockelemente festlegen.
Sie können dies mit jQuery einfach tun, indem Sie:
quelle
Seit einigen Wochen habe ich festgestellt, dass die Javascript-Funktion, mit der ich die Chrome-Aktualisierungsaktion deaktiviert habe, nicht mehr funktioniert. Ich habe dies gemacht, um es zu lösen:
quelle
Reine js Lösung.
quelle
Was ich getan habe, war Folgendes zu den
touchstart
undtouchend
/touchcancel
Ereignissen hinzuzufügen :Da Chrom nicht scrollt, wenn es sich nicht in der Position scrollY befindet
0
wird verhindert, dass Chrome zum Aktualisieren zieht.Wenn es immer noch nicht funktioniert, versuchen Sie dies auch beim Laden der Seite.
quelle
Ich habe das Pull-Down-to-Refresh-Problem damit gelöst:
quelle