Malheureusement, il n'y a pas de moyen direct de le dire.
Je dirais que si vous pouvez redessiner votre application pour qu'elle ne dépende pas de ce type de flux, allez-y.
Si ce n'est pas le cas, une astuce à laquelle je pense est de suivre les scrolls initiés par l'utilisateur et de vérifier cela pour voir si le scroll a été déclenché par le navigateur ou par l'utilisateur.
Voici un exemple que j'ai mis en place qui le fait assez bien (à l'exception des navigateurs où jQuery history pose problème).
Vous devez exécuter cela localement pour pouvoir le tester complètement (jsFiddle/jsbin ne sont pas adaptés car ils encapsulent le contenu dans un iFrame).
Voici les cas de test que j'ai validés:
- Chargement de la page -
userScroll
est false
- Défilement avec la souris/le clavier -
userScroll
devient true
- Cliquer sur le lien pour sauter en bas de page -
userScroll
devient false
- Cliquer sur Retour/Avant -
userScroll
devient false
;
bonjour
cliquez ici pour descendre
juste là
var userScroll = false;
function mouseEvent(e) {
userScroll = true;
}
$(function() {
// réinitialiser le drapeau sur Retour/Avant
$.history.init(function(hash){
userScroll = false;
});
$(document).keydown(function(e) {
if(e.which == 33 // page up
|| e.which == 34 // page dn
|| e.which == 32 // espace
|| e.which == 38 // haut
|| e.which == 40 // bas
|| (e.ctrlKey && e.which == 36) // ctrl + home
|| (e.ctrlKey && e.which == 35) // ctrl + fin
) {
userScroll = true;
}
});
// détecter le défilement par l'utilisateur via la souris
// Mozilla/Webkit
if(window.addEventListener) {
document.addEventListener('DOMMouseScroll', mouseEvent, false);
}
//pour IE/OPERA etc
document.onmousewheel = mouseEvent;
// réinitialiser le drapeau lorsque les ancres nommées sont cliquées
$('a[href*=#]').click(function() {
userScroll = false;
});
// détecter le défilement par le navigateur/l'utilisateur
$(document).scroll( function(){
console.log('Défilement initié par ' + (userScroll == true ? "l'utilisateur" : "le navigateur"));
});
});
Notes:
- Cela ne suit pas le défilement lorsque l'utilisateur fait glisser la barre de défilement avec la souris. Cela peut être ajouté avec un peu plus de code, que j'ai laissé en exercice pour vous.
- Les
event.keyCodes
peuvent varier en fonction du système d'exploitation, vous devrez donc les adapter en conséquence.
J'espère que cela vous aidera!
1 votes
Je ne suis pas sûr de votre question, si vous considérez le saut en utilisant le bouton retour vers moi un événement de défilement du navigateur ou de l'utilisateur. En général : Que considérez-vous comme "défilement par le navigateur" ? Si vous voulez dire le défilement initié par votre script, alors tout ce que vous avez à faire, c'est lorsque votre script défile, soit de désactiver le gestionnaire d'événements, soit de définir un indicateur pour que le gestionnaire d'événements sache l'ignorer.
0 votes
J'ai considéré le défilement via le bouton de retour comme un "défilement du navigateur". Tout autre chose - la molette de la souris, les flèches haut/bas, le clic sur le bouton central, etc. serait un défilement de l'utilisateur. Je suppose que ma vraie question pourrait être - y a-t-il un moyen de différencier d'où provient un événement ? J'ai regardé les propriétés sur l'objet événement, mais je n'ai rien trouvé. Les trois scénarios que je peux imaginer sont le défilement initié par le navigateur, le défilement initié par JavaScript et le défilement initié par l'utilisateur. J'espère que cela clarifie les choses.
0 votes
@mrtsherman J'ai trouvé certains de ces éléments tout en obtenant le même résultat : stackoverflow.com/questions/2834667/…