2012-02-19 24 views
5

Tengo un elemento desplazable con muchos elementos secundarios y una etiqueta de selección con las opciones correspondientes.Escuchar JS .scroll() de manera eficiente

que quieren cambiar el valor del selecto sobre la base de los elementos .scrollTop()

Cómo hacerlo de manera eficiente? Pensé en almacenar el .offset().top de los niños en una matriz y recorrerlo. Sin embargo, el navegador no lo maneja. Podría intentar crear una bandera .setTimeout(), pero eso no parece limpio.

r = $('ul') 
    offsets = [] 
    r.find('li').each((index) -> 
     offsets[index] = $(this).offset().top 
    ) 
    r.bind('scroll', -> 
     // while loop checking .scrollTop() > offsets[n] is slow 
     // maybe spams to many .scroll events? 
    ) 

Respuesta

9

¿Qué tal lo que dijo @osoner + en lugar de hacer todos los cálculos en el controlador de desplazamiento uniforme, desencadena otro evento en el controlador después de un intervalo (por ejemplo, 'fooscroll') y luego tiene todos los elementos secundarios suscritos a el evento, y se actualizan en función de las condiciones que establezca.

var scrollTimer; 
$(window).on('scroll', function(e) { 
    if (scrollTimer) { clearTimeout(scrollTimer); } 
    scrollTimer = setTimeout(function() { 
     $(window).trigger('fooscroll'); 
    }, 200); 
}); 

$('li').on('fooscroll', function() { 
    // Check scrollTop or whatever... 
}); 
+0

Me gusta este one better (hate 'setInterval'). ¡Gracias! – mreq

+0

¿Estoy viendo bien que el evento "fooscroll" solo se active si el usuario deja de desplazarse durante 200 ms? – Simon

+0

@Simon: Sí, tienes razón. Para aclarar, no, no 'estrangula' el desplazamiento. Si desea disparar el desplazamiento cada 200 ms en lugar de solo una vez que los usuarios lo hayan hecho, tendrá que hacerlo de manera diferente. – hayavuk

6

Debe leer this suggestion from John Resig. Básicamente establece un indicador cada vez que el usuario se desplaza y realiza la acción que desea con una función de intervalo que verifica este indicador.

Cuestiones relacionadas