Desafortunadamente, no hay una manera directa de decir eso.
Yo diría que si puede rediseñe su aplicación para que no dependa de este tipo de flujo, vaya para eso.
Si no, una solución que puedo pensar es hacer un seguimiento de las volutas iniciadas por el usuario y verificar que el scroll fue activado por el navegador o por el usuario.
He aquí un ejemplo que preparé, que lo hace bastante bien (excepto en navegadores donde el historial de jQuery tiene problemas).
Necesita ejecutar esto localmente para poder probarlo completamente (jsFiddle/jsbin no son buenos ajustes ya que iFrame los contenidos).
Aquí está la casos de prueba que yo validado:
- página se carga -
userScroll
es false
- de desplazamiento a través del ratón/teclado -
userScroll
convierte true
- Haga clic en el enlace para saltar a pie de página -
userScroll
se convierte en false
- Haga clic en Atrás/Adelante -
userScroll
se convierte en false
;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="https://raw.github.com/tkyk/jquery-history-plugin/master/jquery.history.js"></script>
</head>
<body>
<span> hello there </span><br/>
<a href="#bottom"> click here to go down </a>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<a name="bottom"> just sitting </a>
</body>
<script type="text/javascript">
var userScroll = false;
function mouseEvent(e) {
userScroll = true;
}
$(function() {
// reset flag on back/forward
$.history.init(function(hash){
userScroll = false;
});
$(document).keydown(function(e) {
if(e.which == 33 // page up
|| e.which == 34 // page dn
|| e.which == 32 // spacebar
|| e.which == 38 // up
|| e.which == 40 // down
|| (e.ctrlKey && e.which == 36) // ctrl + home
|| (e.ctrlKey && e.which == 35) // ctrl + end
) {
userScroll = true;
}
});
// detect user scroll through mouse
// Mozilla/Webkit
if(window.addEventListener) {
document.addEventListener('DOMMouseScroll', mouseEvent, false);
}
//for IE/OPERA etc
document.onmousewheel = mouseEvent;
// to reset flag when named anchors are clicked
$('a[href*=#]').click(function() {
userScroll = false;
});
// detect browser/user scroll
$(document).scroll(function(){
console.log('Scroll initiated by ' + (userScroll == true ? "user" : "browser"));
});
});
</script>
</html>
Notas:
- Esto no hace un seguimiento de desplazamiento cuando el usuario arrastra la barra de desplazamiento con el ratón. Esto se puede agregar con más código, que dejé como ejercicio para ti.
event.keyCodes
puede variar según el sistema operativo, por lo que es posible que tenga que cambiarlo adecuadamente.
Espero que ayude!
No estoy seguro de su pregunta, si considera el salto utilizando el botón de fondo para mí un evento de desplazamiento del navegador o el usuario. En general: ¿Qué considera "desplazarse por el navegador"? Si se refiere al desplazamiento iniciado por su secuencia de comandos, entonces todo lo que necesita hacer es cuando su secuencia de comandos se desplaza, ya sea para desactivar el controlador de eventos o establecer una bandera para que el manejador de eventos sepa ignorarla. – RoToRa
Considero que el desplazamiento a través del botón Atrás es un "desplazamiento del navegador". Cualquier otra cosa: rueda del mouse, flechas arriba/abajo, clic en el botón central, etc. sería un desplazamiento del usuario. Creo que mi verdadera pregunta puede ser: ¿hay alguna manera de diferenciar de dónde viene un evento? Miré las propiedades en el objeto del evento, pero no pude encontrar nada. Los tres escenarios que puedo imaginar son el desplazamiento iniciado por el navegador, el desplazamiento iniciado por JavaScript y el desplazamiento iniciado por el usuario. Espero que eso aclare las cosas. – mrtsherman
@mrtsherman Encontré algunos de estos mientras obtenía el mismo resultado: http://stackoverflow.com/questions/2834667/how-can-i-differentiate-a-manual-scroll-via-mousewheel-scrollbar-from- a-javasc – AlphaMale