jquery - sirve - precio generate press




Cómo ejecutar el código después de que todos los demás eventos hayan sido manejados (2)

Prueba esto:

function postpone( fun )
{
  window.setTimeout(fun,0);
}

así que si llamas postpone(do_something); ese do_something se ejecutará después de todos los eventos de IU que se encuentren en la cola de eventos para el momento de la llamada postpone() .

Tengo un controlador de eventos, pero quiero asegurarme de que esperará hasta que todos los demás eventos en la cola de eventos se hayan ejecutado.

Por ejemplo, tengo algunas pestañas en una página. Tengo un código general para manejar las pestañas que establece una pestaña en "Pestaña activa" cuando un usuario hace clic en ella.

$('a.tab').click(function() {
  $(this).parent('div').find('a.tab').removeClass('activeTab');
  $(this).addClass('activeTab');
});

Para un conjunto específico de pestañas, podría tener un controlador:

// handler-1
$('div#myTabs a.tab').click(function() {
  do_something();
});

function do_something() {
  var type = $('div#myTabs a.activeTab').data('type');
  do_something_else(type);
}

do_something () puede ser llamado en respuesta a otras acciones además de hacer clic en una pestaña, pero independientemente de cómo se invoque, quiere saber qué es la pestaña activa antes de que pueda continuar.

Mi problema es que si el código de '// handler-1' lo invoca, es posible que la clase 'activeTab' no se haya restablecido aún, por lo que el valor que recupera para 'type' seguirá siendo de la etiqueta que se seleccionó antes de hacer clic en este.

Lo resolví así:

// handler-1
$('div#myTabs a.tab').click(function() {
  set_timeout( function() {
    do_something();
  }, 100);
});

Esto parece demasiado de un kludge para satisfacerme. ¿Cómo sé que solo se llamará al controlador de eventos del temporizador después de que todos los demás controladores hayan tenido su turno? Claro que podría cambiar "100" a "1000" o incluso "10000" pero también estaría cambiando el rendimiento para mayor certeza (y aún no hay certeza, ya que incluso 10 segundos puede no ser suficiente en una instancia del navegador en una máquina que es lo suficientemente lisiado).

He visto varias soluciones posibles:

pero ninguno de estos es lo suficientemente general para satisfacerme. No estoy tratando de conseguir un controlador para ejecutar primero . Más bien, quiero algo como esto:

function do_something() {
  $.when_all_other_events_have_been_handled(function() {
    do_something();
  });
});

¿Existe algo como esto?

Miré $ .fn.when (arg) .done (), ¿pero cuándo? "arg" en este caso tendría que ser un objeto diferido que ejecuta lo que ya está en la cola de ejecución. Un Catch-22!

Sproutcore tiene algo como "engine.run ()" (no recuerdo el nombre exacto) que se devolverá solo cuando todos los demás eventos en el "motor" hayan sido manejados, pero no puedo encontrar nada de eso en jQuery. ( http://api.jquery.com/category/events/ ). Si alguien sabe algo así, ¡por favor avísame!

¡Gracias! :)


Puede que haya encontrado la respuesta aquí: http://ejohn.org/blog/how-javascript-timers-work/

Según J. Resig, si lo hago

setTimeout(function() {
  do_something();
}, 0);

la función anónima se activará de inmediato, pero no se llamará hasta que todo lo demás en la cola de eventos ya haya sido manejado. Es decir, siempre y cuando el navegador en el que se ejecute realmente ejecute todo en una base de primero en entrar, primero como lo esperaría. Si por alguna razón, el motor de Javascript se encarga de reordenar los eventos en la cola (no sé por qué debería hacerlo, pero nunca se sabe desde AFAIK. Nunca he visto tal garantía en los estándares, pero luego necesito mirar otra vez) entonces todas las apuestas están apagadas!





jquery