代码之家  ›  专栏  ›  技术社区  ›  Kyle

jquery-确保事件处理程序最后在处理程序链中执行

  •  11
  • Kyle  · 技术社区  · 14 年前

    是否有方法确保附加的事件处理程序是要执行的事件处理程序链中的最后一个?

    我有一个通过Ajax提交表单的事件处理程序,但是稍后,在附加我的Ajax提交处理程序之后,另一个处理程序将附加到表单以进行验证逻辑。验证逻辑应该出现在Ajax提交处理程序之前,但由于随后绑定了它,所以验证逻辑没有出现。

    有没有一种方法可以使我的Ajax提交处理程序始终是处理程序链中最后一个要执行的处理程序,而不更改处理程序的绑定顺序?

    2 回复  |  直到 10 年前
        1
  •  5
  •   Community CDub    8 年前

    我认为没有办法直接操纵订单。

    看看这个: How to order events bound with jQuery

        2
  •  3
  •   Pedro Pinheiro    10 年前

    我的解决方案( 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);
             }
         }
     }
    

    用途:

    $(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);
    
    });
    

    用一些HTML

    <DIV ID=“el”></DIV>

    一些CSS

    DIV宽度:200px;高度:200px;背景色:红色;

    您可以将其用于任何一个或多个事件:

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