Deaktivieren android ' s chrome pull-down-to-refresh-Funktion
Habe ich ein kleines HTML5-web-Anwendung für meine Firma.
Diese Anwendung zeigt eine Liste der Elemente und alles funktioniert einwandfrei.
Ist die Anwendung hauptsächlich auf android-Handys und Chrome als browser. Auch, die Seite ist gespeichert auf dem home-Bildschirm, so dass Android zu verwalten, die ganze Sache als eine app (mithilfe einer WebView ich denke,).
Chrome Beta (und ich denke auch das Android System WebView) wurde ein "pull down to refresh" - Funktion (Finden Sie unter diesem link zum Beispiel).
Dies ist ein praktisches feature, aber ich Frage mich, ob es sein kann, deaktiviert mit einigen meta-tag (oder javascript-Zeug), weil die regenerieren können leicht ausgelöst werden, indem der Benutzer beim navigieren durch die Liste und die ganze app neu geladen wird.
Auch dies ist ein feature nicht von der Anwendung benötigt werden.
ich weiß, dass dieses feature wird weiterhin nur in der Chrome beta, aber ich habe das Gefühl, dass das Fahrwerk auf die stabile app, auch.
Danke!
Edit: ich habe deinstalliert, Chrome Beta und der link angeheftet auf dem home-Bildschirm öffnet sich nun mit der stabilen Chrome. Also die angehefteten links beginnt mit Chrome und nicht mit einem webview.
Edit: heute (2015-03-19) die pull-down-to-refresh kommt der stabile chrome.
Edit: von @Evyn Antwort, die ich Folgen dieser link und habe dieses javascript/jquery-code, der funktioniert.
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;
}
}
});
Als @bcintegrity darauf hingewiesen, ich hoffe, für eine Website, manifest Lösung (und/oder meta-tag) in die Zukunft.
Außerdem Vorschläge für den code oben, sind willkommen.
- Ja das ist wirklich beschissen. War in der Mitte der form und gescrollt werden, um oben zu weit und es aktualisiert und alles verloren. Dies ist eine verzögerte Standard-feature, ich klicken Sie auf das Symbol "Aktualisieren", wenn ich aktualisieren möchten!
- Wäre schön, wenn dieses feature deaktiviert werden können, in meinem web-app-manifest. Leider sind alle Seiten auf meiner web-app hat scrollbaren Inhalt, dass es fast unmöglich zu navigieren, ohne eine Aktualisierung. Ich bin ein wenig abgehakt. :/
- Das ist eine gute info. Ich hasse Websites, deaktivieren Sie die pull to refresh Funktion. Ich möchte zu entwickeln, eine Funktion, um die Aktualisierung funktioniert, unabhängig von den Inhalten der Seite.
- Gerade als web-Entwickler, pulldown-Aktualisierung ist nicht kompatibel mit Daten-driven websites, wie es lädt die Anwendung. Es macht es unmöglich für einen Benutzer, um einen Bildlauf zum oberen Rand einer Seite ohne Aktualisierung der gesamten Seite. Ich bin zu 100% unterstützt Chrome, hoffe Sie entfernen diese anti-feature.
- Ein anderer Entwickler hier: wenn Sie Ihre Anwendung entwickeln elegant, ist dieses nicht ein problem, wenn Sie einen datastore-wie Redux dann synchronisieren Sie Ihre "konsistenten" Daten mit "localstorage". Daten, die aktualisiert werden muss, wird dann update perfekt - und Formular-Einträge etc wird beibehalten, selbst-refresh-events.
- Ich stieß mich mit dieser GC "feature"... viele web-Seiten, viele Formen, eine unvorsichtige ziehen Sie nach unten mit meine finger und Daten auf dieser Seite sind alle verloren! Retard-Funktion IMO. Es sollte standardmäßig deaktiviert, wer braucht es dann, lassen es code. Ich fragte mich durch die Tage, warum meine "Kunden", die gelegentlich verloren, Ihre Daten auf GC...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die Standard-Aktion des pull-to-refresh-Effekt kann wirksam verhindert werden, indem Sie einen der folgenden Schritte aus :
preventDefault
'ing, die einen Teil des touch-Sequenz, einschließlich der folgenden (in der Reihenfolge der meisten störend am wenigsten störende):touch-action: none
" touch-gezielte Elemente, gegebenenfalls deaktivieren der Standard-Aktionen (einschließlich pull-to-refresh) touch-Sequenz.overflow-y: hidden
" für das body-element mit einem div-Tag für scrollbare Inhalte, wenn nötig.chrome://flags/#disable-pull-to-refresh-effect
).Sehen Sie mehr
Einfache Lösung für 2019+
Chrom 63 (veröffentlicht am 5. Dezember 2017) hat eine css-Eigenschaft, um zu helfen mit genau dieser. Habe einen Lesevorgang durch diese Anleitung von Google Ihnen eine gute Vorstellung davon, wie Sie damit umgehen können.
Hier ist die TL:DR
Um es zu erhalten zu arbeiten, alles, was Sie hinzufügen müssen, ist dies in der CSS:
Ist es auch nur unterstützt von Chrom -, Edge-und Firefox für jetzt, aber ich bin mir sicher, dass Safari hinzufügen wird es bald, wie Sie scheinen zu sein, vollständig an Bord mit dem service-Mitarbeiter und die Zukunft der PWA ist.
Im moment können Sie nur deaktivieren Sie diese Funktion über chrome://flags/#disable-pull-to-refresh-Wirkung - öffnen Sie direkt von Ihrem Gerät.
Könnten Sie versuchen, zu fangen
touchmove
Veranstaltungen, aber die Chancen sind sehr gering erreichen ein akzeptables Ergebnis.Verwende ich MooTools, und ich habe eine Klasse angelegt zu deaktivieren, aktualisieren Sie auf eine gezielte element, aber die crux ist es (native JS):
Alles, was wir hier tun, ist zu finden die y-Richtung der touchmove, und wenn wir uns bewegen, um den Bildschirm nach unten und das Ziel scroll 0 ist, stoppen wir die Veranstaltung. Also kein refresh.
Bedeutet das, dass wir brennen auf jedem "move", das kann teuer werden, aber ist die beste Lösung, die ich bis jetzt gefunden habe ...
scrolltop > 0
, das Ereignis wird nicht ausgelöst. In meiner Umsetzung, ich Binde dietouchmove
Veranstaltung auftouchstart
nur, wennscrollTop <= 0
. Ich unbind es, sobald der Benutzer scrollt (initialY >= e.touches[0].clientY
). Wenn der Benutzer scrollt bis (previousY < e.touches[0].clientY
), dann rufe ichpreventDefault
.AngularJS
Habe ich erfolgreich deaktiviert es mit diesem AngularJS Richtlinie:
Es ist sicher, um zu stoppen beobachten, sobald der Benutzer scrollt nach unten, da die pull-to-refresh keine chance hat, ausgelöst wird.
Ebenfalls, wenn
scrolltop > 0
, das Ereignis wird nicht ausgelöst. In meiner Umsetzung, ich Binde das touchmove-Ereignis auf touchstart, nur wennscrollTop <= 0
. Ich unbind es, sobald der Benutzer scrollt (initialY >= e.touches[0].clientY
). Wenn der Benutzer scrollt bis (previousY < e.touches[0].clientY
), dann rufe ichpreventDefault()
.Spart uns dies aus der Beobachtung scroll-Ereignisse unnötig, noch Blöcke overscrolling.
jQuery
Wenn Sie mit jQuery, das ist die ungetestet entspricht.
element
ist ein jQuery-element:Natürlich, das gleiche kann auch erzielt werden mit reinem JS.
e.originalEvent.touches[0].clientY
um diese Arbeit zu machen. Kämpfen noch immer mit der Logik wenn um zu verhindern, dass neu zu laden. Momentan scheint es zufällig zu verhindern, dass das scrollen nach oben Setzen ... danke für den Hinweis in die richtige Richtung!Nach vielen Stunden versuchen, diese Lösung funktioniert bei mir
html{touch-action:pan-down}
Einfache Javascript
Ich implementiert mit standard-javascript. Einfach und leicht zu implementieren. Einfach einfügen und es funktioniert gut.
body: {overflow-y:hidden}
trick von Evyn oben.Die beste Lösung auf reiner CSS:
Sehen Sie sich diese demo: https://jsbin.com/pokusideha/quiet
Finde ich die Einstellung Körper CSS overflow-y:hidden ist der einfachste Weg. Wenn Sie nicht wollen, um eine scrolling-Seite Anwendung können Sie einfach einen div-container mit Scroll-Funktionen.
Seit ein paar Wochen fand ich heraus, dass die javascript-Funktion, die ich verwendet, um deaktivieren Sie den Chrome-refresh-Aktion nicht mehr funktioniert. Ich habe dies gemacht, um es zu lösen:
JS:
HTML:
Beachten Sie, dass overflow-y ist nicht geerbt, so müssen Sie es auf ALLE block-Elemente.
Kann man dies mit jQuery einfach durch:
Was ich Tat, war fügen Sie Folgendes zu der
touchstart
undtouchend
/touchcancel
Veranstaltungen:Da chrome nicht scrollen, wenn es nicht auf scrollY position
0
dies verhindert, dass chrome zu tun, ziehen Sie zu aktualisieren.Wenn es dann immer noch nicht funktioniert, versuchen Sie auch dies zu tun, wenn die Seite geladen wird.
Reinen js Lösung.
Löste ich den pull-down-to-refresh-problem mit diesem: