附加jQuery事件处理程序,以便首先触发它们

有没有办法附加一个jQuery事件处理程序,以便处理程序在任何先前附加的事件处理程序之前触发?我遇到了 this article,但代码没有工作,因为事件处理程序不再存储在数组,这是他的代码期望的。我试图创建一个jQuery扩展来做我想要的,但这不工作(事件仍然按照他们绑定的顺序):
$.fn.extend({
    bindFirst: function(type,handler) {

        var baseType = type;
        var dotIdx = type.indexOf('.');
        if (dotIdx >= 0) {
            baseType = type.substr(0,dotIdx);
        }

        this.each(function() {
            var oldEvts = {};
            var data = $.data(this);
            var events = data.events || data.__events__;
            var handlers = events[baseType];
            for (var h in handlers) {
                if (handlers.hasOwnProperty(h)) {
                    oldEvts[h] = handlers[h];
                    delete handlers[h];
                    // Also tried an unbind here,to no avail
                }
            }

            var self = $(this);
            self.bind(type,handler);

            for (var h in oldEvts) {
                if (oldEvts.hasOwnProperty(h)) {
                    self.bind(baseType,oldEvts[h]);
                }
            }
        });
    }
});

是否有自然的方式重新排序事件处理?如果没有,你知道我可以应用的技术吗?我使用jQuery 1.4.1,但我会升级,如果我必须。

解决方法

这里有一个简单的插件我做了一回。让您将处理程序绑定到列表的开头。这是非常简单,我不能保证它适用于命名空间事件或任何可怕的幻想。

对于简单绑定单个或空格分隔的事件组,它应该工作。

示例:http://jsfiddle.net/gbcUy/

$.fn.bindUp = function(type,fn) {

    type = type.split(/\s+/);

    this.each(function() {
        var len = type.length;
        while( len-- ) {
            $(this).bind(type[len],fn);

            var evt = $.data(this,'events')[type[len]];
            evt.splice(0,evt.pop());
        }
    });
};

或者,如果你想以一些其他方式操作处理程序数组,只是获取你想要的元素的处理程序,并操纵它,但你想要:

示例:http://jsfiddle.net/gbcUy/1/

var clickHandlers = $('img').data('events').click;

clickHandlers.reverse(); // reverse the order of the Array

相关文章

1.第一步 设置响应头 header('Access-Control-Allow...
$.inArray()方法介绍 $.inArray()函数用于在数组中搜索指定的...
jquery.serializejson.min.js的妙用 关于这个jquery.seriali...
JS 将form表单数据快速转化为object对象(json对象) jaymou...
jQuery插件之jquery.spinner数字智能增减插件 参考地址:http...