Estou criando um sistema de paginação (como o Facebook) em que o conteúdo é carregado quando o usuário rola para baixo. Eu imagino que a melhor maneira de fazer isso é descobrir quando o usuário está na parte inferior da página e executar uma consulta ajax para carregar mais postagens.
O único problema é que não sei como verificar se o usuário rolou para a parte inferior da página com o jQuery. Alguma ideia?
Preciso encontrar uma maneira de verificar quando o usuário rolou para a parte inferior da página com o jQuery.
javascript
jquery
scroll
pagination
Johnny
fonte
fonte
Respostas:
Use o
.scroll()
eventowindow
como este:Você pode testá-lo aqui , isso leva a rolagem superior da janela; portanto, quanto é rolada para baixo, adiciona a altura da janela visível e verifica se isso é igual à altura do conteúdo geral (
document
). Se você quiser verificar se o usuário está perto da parte inferior, seria algo como isto:Você pode testar essa versão aqui , basta ajustá-la
100
para qualquer pixel da parte inferior em que você deseja acionar.fonte
console.log()
vez de alertar, às vezes repete o comando.A resposta de Nick Craver funciona bem, poupando a questão de que o valor
$(document).height()
varia de acordo com o navegador.Para fazê-lo funcionar em todos os navegadores, use esta função de James Padolsey :
no lugar de
$(document).height()
, para que o código final seja:fonte
min
vez demax
, especialmente se houver uma margem, para evitar impedir acidentalmente o usuário de rolar para o que você acha que é a parte inferior da página.Não sei exatamente por que isso ainda não foi publicado, mas, de acordo com a documentação do MDN , a maneira mais simples é usar propriedades javascript nativas:
Retorna true quando você está na parte inferior de qualquer elemento rolável. Então, basta usar javascript:
scrollHeight
tem amplo apoio em navegadores, do IE 8 para ser mais preciso, ao mesmo tempoclientHeight
escrollTop
são ambos suportados por todos. Mesmo ie 6. Isso deve ser seguro para vários navegadores.fonte
var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );
. Isso é útil para rolar automaticamente um campo se já estiver na parte inferior (para que o usuário possa examinar manualmente uma parte específica de um log em tempo real sem perder seu lugar, etc.).200.181819304947
e200
). Eu adicionei umMath.floor()
para ajudar a lidar com isso, mas não sei o quão confiável isso será.Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0
(substitua 3.0 por qualquer tolerância de pixel que considere apropriada para suas circunstâncias). Este é o caminho a percorrer porque (A)clientHeight
,scrollTop
eclientHeight
são todos arredondados, o que poderia levar a um erro de 3px se todos os alinhamentos, (B) 3 pixels não estiverem visíveis para o usuário, para que ele possa pensar que algo está errado com seu site. quando eles "pensam" que estão na parte inferior da página, quando na verdade não estão, e (C) certos dispositivos (especialmente os sem mouse) podem ter um comportamento estranho ao rolar a tela.Para aqueles que usam a solução de Nick e recebem alertas / eventos repetidos, é possível adicionar uma linha de código acima do exemplo de alerta:
Isso significa que o código será acionado apenas na primeira vez em que você estiver a 100px da parte inferior do documento. Ele não será repetido se você rolar para cima e para baixo, o que pode ou não ser útil, dependendo do uso do código de Nick.
fonte
Além da excelente resposta aceita por Nick Craver, você pode controlar o evento de rolagem para que não seja acionado com tanta frequência, aumentando assim o desempenho do navegador :
fonte
A resposta de Nick Craver precisa ser ligeiramente modificada para funcionar no iOS 6 Safari Mobile e deve ser:
Alterar (janela) .height $ () para window.innerHeight deve ser feito porque quando a barra de endereços está escondido um 60px adicionais são adicionados à altura da janela, mas usando
$(window).height()
que não refletem essa mudança, enquanto estiver usandowindow.innerHeight
o faz.Nota : A
window.innerHeight
propriedade também inclui a altura da barra de rolagem horizontal (se for renderizada), diferente da$(window).height()
que não incluirá a altura da barra de rolagem horizontal. Isso não é um problema no Mobile Safari, mas pode causar comportamento inesperado em outros navegadores ou versões futuras do Mobile Safari. Alterar==
para>=
poderia corrigir isso nos casos de uso mais comuns.Leia mais sobre a
window.innerHeight
propriedade aquifonte
Aqui está uma abordagem bastante simples
const didScrollToBottom = elm.scrollTop + elm.clientHeight == elm.scrollHeight
Exemplo
Onde
elm
é um elemento recuperado de iedocument.getElementById
.fonte
Aqui está um pedaço de código que o ajudará a depurar seu código, testei as respostas acima e as achei com erros. Eu testei o seguinte no Chrome, IE, Firefox, IPad (Safari). Não tenho nenhum outro instalado para testar ...
Pode haver uma solução mais simples, mas parei no ponto em que FUNCIONA
Se você ainda estiver tendo problemas com algum navegador não autorizado, aqui está um código para ajudá-lo a depurar:
Espero que isso poupe tempo a alguém.
fonte
var docElement = document.documentElement; var winElement = window
winElement.pageYOffset
você também pode usarwinElement.scrollY
.Por favor, verifique esta resposta
Você pode fazer
footerHeight - document.body.offsetHeight
para ver se você está perto do rodapé ou alcançou o rodapéfonte
Ele calcula a barra de rolagem da distância até a parte inferior do elemento. Igual a 0, se a barra de rolagem chegou ao fundo.
fonte
Estes são meus dois centavos:
fonte
$(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight
=>$(this).scrollTop() + $(this).outerHeight(true) >= $(this)[0].scrollHeight
JS puro com cross-browser e depuração ( desempenho muito bom )
Demonstração: http://jsbin.com/geherovena/edit?js,output
PS:
Debouncer
,getScrollXY
,getDocHeight
não escrita por mimEu apenas mostro como funciona, e como farei
fonte
Minha solução em js simples:
fonte
Tente isso para a condição de correspondência se rolar para a extremidade inferior
fonte
Nick responde bem, mas você terá funções que se repetem durante a rolagem ou não funcionarão se o usuário tiver a janela ampliada. Eu vim com uma correção fácil apenas math.round a primeira altura e funciona da mesma forma que assumido.
fonte
Você pode tentar o seguinte código,
fonte
Isso fornece resultados precisos, ao verificar um elemento rolável (ou seja, não
window
):offsetHeight
deve fornecer a altura visível real de um elemento (incluindo preenchimento, margem e barras de rolagem) escrollHeight
é a altura inteira de um elemento, incluindo áreas invisíveis (excedidas).jQuery
's.outerHeight()
deve dar resultado semelhante ao JS de.offsetHeight
- a documentação em MDN paraoffsetHeight
se sabe sobre o seu apoio cross-browser. Para cobrir mais opções, isso é mais completo:fonte
Math.floor(element.scrollTop) === element.scrollHeight - element.offsetHeight
no caso do scrollTop ser um decimal que não funcionará semMath.floor()
Todas essas soluções não funcionam para mim no Firefox e Chrome, então eu uso funções personalizadas de Miles O'Keefe e meder omuraliev assim:
fonte
Aqui estão meus dois centavos, pois a resposta aceita não funcionou para mim.
fonte
Em vez de ouvir o evento de rolagem, usar o Intersection Observer é barato para verificar se o último elemento estava visível na janela de exibição (ou seja, o usuário médio foi rolado para baixo). Também suportou o IE7 com o polyfill .
fonte
.observe(...)
ouvinte de um evento como quando o usuário passa / toca no contêiner de rolagem para que ele não seja acionado imediatamente.Deixe-me mostrar approch sem JQuery. Função JS simples:
Exemplo curto de como usá-lo:
fonte
Usei o @ddanone answerear e adicionei a chamada Ajax.
}
fonte
Para parar o alerta repetido da resposta de Nick
fonte
O Google Chrome fornece toda a altura da página, se você ligar
$(window).height()
Em vez disso, use
window.innerHeight
para recuperar a altura da sua janela. A verificação necessária deve ser:fonte
Aparentemente, o que funcionou para mim foi 'corpo' e não 'janela' assim:
para compatibilidade entre navegadores, use:
e depois em vez de $ (document) .height () chame a função getheight ()
para uso próximo ao fundo:
fonte