¿Cómo se reduce la frecuencia de las consultas de eventos de JavaScript? Los eventos que me preocupan son onResize y onScroll. Estos eventos pueden desencadenarse docenas de veces por segundo cuando alguien cambia el tamaño de su navegador o se desplaza hacia abajo, respectivamente. Me gustaría que estos eventos ocurrieran solo una vez cada 500 ms, así que no tengo que perder horas optimizando mis controladores de eventos y asegurándome de que no pierdan memoria.Disminuya la frecuencia de la encuesta de eventos de Javascript
Respuesta
var resizeTimeout;
window.onresize = function() {
if (resizeTimeout) {
clearTimeout(resizeTimeout);
}
resizeTimeout = setTimeout(function() {
// Do it!
}, 500);
});
Esto activará las funciones setTimeout()
~ 500 ms después de que hayan terminado de cambiar el tamaño.
La versión onscroll
es muy similar :)
Realmente no se puede controlar con qué frecuencia se activa el evento, se puede hacer algo como recordar el momento de la primera cocción de eventos, a continuación, en cada uno consiguiente comprobar si se trata de más de 500 ms desde el primero - si es así, proceda con el controlador de eventos; de lo contrario, simplemente salga del registro de eventos
+1 para esta respuesta, entonces, esto es probablemente lo que quiere el OP. Sin embargo, necesita alguna lógica adicional para manejar el último evento de cambio de tamaño. – casablanca
Creo que la solución del temporizador se ocupará del último evento de cambio de tamaño, por lo que la solución real sería una combinación de los dos – Andrey
Al comienzo de su controlador, verifique si han transcurrido 500ms desde el último, y solo regresar si no.
No puede evitar que se desencadenen estos eventos. Ellos siempre lo hacen. Lo que quiere hacer es dejar de escuchar de inmediato, luego manejar el evento para evitar la repetición. Luego, todo el controlador se configura nuevamente después de setTimeout. No ocurre más recursividad a menos que alguien cambie el tamaño de la ventana. Uso 5000ms aquí, ya que es más fácil verlo funcionar en la consola. No debería ver más de un correo no deseado en la consola de FF cada 5 segundos, incluso si cambia el tamaño como un spaz.
(function staggerListen(){
window.onresize = function(){
window.onresize = false;
console.log('spam');
setTimeout(staggerListen,5000);
};
})()
Utilizando la lógica para decidir si se debe hacer nada cada vez que los fuegos Handler es todavía técnicamente disparando un controlador y una sentencia if + búsqueda. Eso puede ser pesado.
Wow. No estoy seguro de cuál es la sobrecarga para agregar/eliminar dinámicamente la devolución de llamada del oyente, pero +1 por ser complicado, de todos modos. :) – Phrogz
cheque el subrayado debounce función
crea y devuelve una nueva versión antirrebote de la función pasada que posponer su ejecución hasta después de esperar milisegundos que han transcurrido desde la última vez que fue invocada. Útil para implementar un comportamiento que solo debería ocurrir una vez que la entrada ha dejado de llegar. Por ejemplo: renderizar una vista previa de un comentario de reducción, volver a calcular un diseño después de que la ventana haya dejado de cambiar de tamaño, y así sucesivamente.
Ejemplo:
window.onscroll = _.debounce(
function() {
// do something
}, 500, false
);
que utiliza para hacerlo como en la respuesta aceptada, pero el problema es que sólo se activa después de que el tiempo de espera especificado. Quería una solución que manejara el cambio de tamaño de inmediato, la primera vez. Esto es lo que terminé haciendo.
var _resize_is_busy = false;
var _resize_scheduled = false;
var _resize_precision = 100;
// This register for window resize events. No need to change anything.
$(window).resize(function() {
if (!_resize_is_busy) {
// call the scheduler who will do the work and set a timer to
// check of other resizes occured within a certain period of time
_resize_scheduler();
}
else {
// the resizer is busy, i.e. a resize have been handled a little
// time ago and then the scheduler is waiting some time before
// handling any other resize. This flag tells the scheduler that
// a resize event have been receive while he was sleeping.
_resize_scheduled = true;
}
});
// This is the scheduler. No need to change anything.
var _resize_scheduler = function() {
_resize_is_busy = true;
_resize_scheduled = false;
setTimeout(function() {
_resize_is_busy = false;
if (_resize_scheduled)
_handle_resize();
}, _resize_precision);
_handle_resize();
}
var _handle_resize = function() {
console.log('DOING ACTUAL RESIZE');
// do the work here
//...
}
Espero que esto ayude.
- 1. encuesta (2) no vacía la cola de eventos
- 2. Frecuencia de sondeo AJAX: ¿para una encuesta larga o no para una encuesta larga?
- 3. Detección en tiempo real de picos de frecuencia de eventos
- 4. Buscando la mejor aplicación de encuesta Asp.net
- 5. frecuencia de actualización establecida para deviceMotionUpdateInterval ¿es la frecuencia real?
- 6. frecuencia NAudio intensidad de la banda
- 7. Javascript: la eliminación de un detector de eventos anónimo
- 8. ¿Cómo obtener la frecuencia de muestreo y la frecuencia del archivo de música (MP3) en android?
- 9. Secuencia de eventos de JavaScript
- 10. Crear encuesta/votación/encuesta única en php
- 11. Detectando la frecuencia fundamental
- 12. Error con la encuesta de Compass en Windows 7
- 13. ¿Encuesta la base de datos desde una página web? - ASP.NET
- 14. Técnicas para calcular la frecuencia de adjetivo
- 15. correctamente enlazar eventos de javascript
- 16. Obtenga información sobre la escucha de eventos en JavaScript
- 17. ¿Cómo uso la tecla Intro como manejador de eventos (javascript)?
- 18. Propagación de eventos en Javascript
- 19. Orden de controlador de eventos de Javascript
- 20. Javascript registro de eventos de cierre de la ventana/pestaña antes de la ventana/pestaña estrecha
- 21. Biblioteca de eventos javascript modular
- 22. Explorador de eventos Scroll javascript
- 23. JavaScript: eliminar detector de eventos
- 24. iOS encuesta de fondo sin servicios de ubicación
- 25. Trading de alta frecuencia en la JVM con Scala/Akka
- 26. Cómo obtener la frecuencia de la CPU en C#
- 27. Disminuya la latencia de mostrar sugerencias (como el título de img)
- 28. permite a los usuarios crear formularios dentro de la aplicación de recopilación de datos/encuesta android
- 29. Javascript Gestor de Eventos de impresión
- 30. Ensamblaje Algoritmo de medición de frecuencia de la CPU
este no se disparará cada 500 ms, solo se disparará 500 ms después de detener/detener el cambio de tamaño – Andrey
+1 me gano. Recuerde incluir un cheque para 'resizeTimeout' ya que será' 'undefined' la primera vez. – casablanca
@Andrey: Buen punto - Pasé por alto ese. – casablanca