Eu criei um pequeno aplicativo Web HTML5 para minha empresa.
Este aplicativo exibe uma lista de itens e tudo funciona bem.
O aplicativo é usado principalmente em telefones Android e Chrome como navegador. Além disso, o site é salvo na tela inicial para que o Android gerencie tudo como um aplicativo ( usando um WebView, eu acho ).
O Chrome Beta (e acho que também o Android System WebView) introduziu o recurso "puxar para atualizar" ( veja este link, por exemplo ).
Esse é um recurso útil, mas eu queria saber se ele pode ser desativado com alguma metatag (ou material javascript) porque a atualização pode ser facilmente acionada pelo usuário enquanto você navega na lista e o aplicativo inteiro é recarregado.
Além disso, esse é um recurso não necessário ao aplicativo.
Sei que esse recurso ainda está disponível apenas no Chrome beta, mas tenho a sensação de que ele também está chegando ao aplicativo estável.
Obrigado!
Editar: desinstalei o Chrome Beta e o link fixado na tela inicial agora é aberto com o Chrome estável. Portanto, os links fixados começam no Chrome e não em uma visualização na web.
Edit: today (19/03/2015) o pull-down-to-refresh chegou ao chrome estável.
Edit: from @Evyn answer Eu sigo este link e recebi este código javascript / jquery que funciona.
Como o @bcintegrity apontou, espero uma solução de manifesto de site (e / ou uma meta tag) no futuro.
Além disso, sugestões para o código acima são bem-vindas.
fonte
Respostas:
A ação padrão do efeito de puxar para atualizar pode ser efetivamente evitada seguindo um destes procedimentos:
preventDefault
uma parte da sequência de toque, incluindo qualquer um dos seguintes (na ordem de mais perturbador para menos perturbador):touch-action: none
" a elementos segmentados por toque, quando apropriado, desativando ações padrão (incluindo puxar para atualizar) da sequência de toque.overflow-y: hidden
” ao elemento body, usando uma div para o conteúdo rolável, se necessário.chrome://flags/#disable-pull-to-refresh-effect
).Ver mais
fonte
Solução simples para 2019+
O Chrome 63 adicionou uma propriedade css para ajudar exatamente com isso. Leia este guia do Google para ter uma boa idéia de como lidar com isso.
Aqui está o TL: DR
Para que funcione, tudo o que você precisa adicionar é o seguinte no seu CSS:
Por enquanto, ele também é suportado apenas pelo Chrome, Edge e Firefox, mas tenho certeza de que o Safari o adicionará assim que parecerem totalmente integrados aos profissionais de serviço e ao futuro dos PWAs.
fonte
No momento, você só pode desativar esse recurso via chrome: // flags / # disable-pull-to-refresh-effect - abra diretamente do seu dispositivo.
Você pode tentar capturar
touchmove
eventos, mas as chances são muito pequenas de obter um resultado aceitável.fonte
Eu uso o MooTools e criei uma classe para desativar a atualização em um elemento de destino, mas o ponto crucial é (JS nativo):
Tudo o que fazemos aqui é encontrar a direção y do touchmove e, se estivermos movendo a tela para baixo e o scroll de destino for 0, interromperemos o evento. Assim, nenhuma atualização.
Isso significa que estamos disparando a cada 'movimento', o que pode ser caro, mas é a melhor solução que encontrei até agora ...
fonte
scrolltop > 0
o evento não for acionado. Na minha implementação, vinculo otouchmove
eventotouchstart
somente sescrollTop <= 0
. Desvinculo-o assim que o usuário rola para baixo (initialY >= e.touches[0].clientY
). Se o usuário rolar para cima (previousY < e.touches[0].clientY
), eu ligopreventDefault
.Depois de muitas horas tentando, esta solução funciona para mim
fonte
html{touch-action:pan-down}
AngularJS
Eu o desativei com sucesso com esta diretiva AngularJS:
É seguro parar de assistir assim que o usuário rolar para baixo, pois a atração para atualizar não tem chance de ser acionada.
Da mesma forma, se
scrolltop > 0
o evento não for acionado. Na minha implementação, vinculo o evento touchmove no touchstart, apenas sescrollTop <= 0
. Desvinculo assim que o usuário rola para baixo (initialY >= e.touches[0].clientY
). Se o usuário rolar para cima (previousY < e.touches[0].clientY
), eu ligopreventDefault()
.Isso nos impede de assistir a eventos de rolagem desnecessariamente, mas bloqueia o excesso de rolagem.
jQuery
Se você estiver usando jQuery, este é o equivalente não testado .
element
é um elemento jQuery:Naturalmente, o mesmo também pode ser alcançado com JS puro.
fonte
e.originalEvent.touches[0].clientY
para fazer isso funcionar. Ainda lutando com a lógica quando impedir a recarga. No momento, parece impedir aleatoriamente a rolagem para cima ... Coloque agradecimentos pela dica na direção certa!Javascript simples
Eu implementei usando javascript padrão. Simples e fácil de implementar. Basta colar e ele funciona bem.
fonte
body: {overflow-y:hidden}
truque de Evyn acima .A melhor solução em CSS puro:
Veja esta demonstração: https://jsbin.com/pokusideha/quiet
fonte
Você pode tentar isso
exemplo:
https://ebidel.github.io/demos/chatbox.html
documento completo https://developers.google.com/web/updates/2017/11/overscroll-behavior
fonte
Acho que definir o seu corpo CSS overflow-y: hidden é a maneira mais simples. Se você deseja ter uma página de aplicativo de rolagem, basta usar um contêiner div com recursos de rolagem.
fonte
Observe que o overflow-y não é herdado, portanto, você deve configurá-lo em TODOS os elementos do bloco.
Você pode fazer isso com o jQuery simplesmente:
fonte
Há algumas semanas, descobri que a função javascript usada para desativar a ação de atualização do Chrome não funcionará mais. Eu fiz isso para resolvê-lo:
fonte
Solução js pura.
fonte
O que eu fiz foi adicionar o seguinte aos
touchstart
etouchend
/touchcancel
events:Como o chrome não rola se não estiver na posição scrollY,
0
isso impedirá o chrome de puxar para atualizar.Se ainda assim não funcionar, tente fazer isso quando a página for carregada.
fonte
Resolvi o problema de puxar para baixo para atualizar com isso:
fonte