2010-06-30 10 views
10

¿Hay alguna manera de asegurarse de que el controlador de eventos que adjunte sea el último en la cadena de controladores de eventos que se ejecutará?Jquery: asegúrese de que la última vez que se ejecute el controlador de eventos en la cadena de controladores

Tengo un controlador de eventos que envía un formulario por ajax, pero en un momento posterior, después de adjuntar mi controlador de envío de ajax, se adjunta otro controlador al formulario para hacer la lógica de validación. La lógica de validación debe ocurrir antes del controlador de envío ajax, pero no lo hace, ya que se vinculó posteriormente.

¿Hay alguna manera de hacerlo así que mi controlador de envío de ajax siempre es el último controlador en la cadena de controladores que se ejecutarán, sin cambiar el orden en que están vinculados los controladores?

+0

le puede dar un pedazo de código? – dzida

+0

Ver una [pregunta] similar (http://stackoverflow.com/questions/2360655/jquery-event-handlers-always-execute-in-order-they-were-bound-any-way-around-th/2641047# 2641047). – Anurag

+0

Publiqué una solución diferente a este problema en [esta pregunta] (http://stackoverflow.com/a/19674508/315024). – Walf

Respuesta

4

No creo que haya una forma de manipular el pedido directamente.

Tome un vistazo a esto: How to order events bound with jQuery

+1

Esto no debería haber sido una respuesta; debería haber sido un voto para cerrar como duplicado. – Flimzy

1

Mi solución (http://jsfiddle.net/968jj/1345/):

$.fn.lastHandler = function (events, handler) { 
    var element = $(this); 
    events = events.split(' '); 
    for (var evt in events) { 
     var event = $(element).data("events")[events[evt]]; 
     var hsucess = null; 
     $.each(event, function (i, h) { 
      if (h.handler == handler) { 
       hsucess = h; 
      } 
     }); 
     var index = event.indexOf(hsucess); 
     if (index > -1) { 
      event.splice(index, 1); 
      event.push(hsucess); 
     } 
    } 
} 

uso:

$(function() { 

    var m1 = function(){ alert("mouseover to be the last"); }; 
    var m2 = function(){ alert("mouseover to be the first"); }; 
    var m3 = function(){ alert("mouseover to be the second"); }; 
    $("#el").mouseover(m1); 
    $("#el").mouseover(m2); 
    $("#el").mouseover(m3); 

    $("#el").lastHandler('mouseover',m1); 

}); 

Con algo de HTML

< div id = "el "> </div >

y algunos CSS

div {width: 200px; altura: 200px; color de fondo: rojo; }

Se puede utilizar con uno cualquiera o más de un evento:

$("#el").lastHandler('keypress keyup change',fnHandler); 
$("#el").lastHandler('click mouseover',fnHandler); 
Cuestiones relacionadas