附加 jQuery 事件处理程序,以便它们首先被触发 [英] Attaching jQuery event handlers so that they are triggered first

查看:23
本文介绍了附加 jQuery 事件处理程序,以便它们首先被触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法附加一个 jQuery 事件处理程序,以便在任何先前附加的事件处理程序之前触发该处理程序?我遇到了这篇文章,但代码没有工作是因为事件处理程序不再存储在数组中,这是他的代码所期望的.我试图创建一个 jQuery 扩展来做我想做的事,但这不起作用(事件仍然按照它们绑定的顺序触发):

Is there a way to attach a jQuery event handler such that the handler is triggered before any previously-attached event handlers? I came across this article, but the code didn't work because event handlers are no-longer stored in an array, which is what his code expected. I attempted to create a jQuery extension to do what I wanted, but this is not working (the events still fire in the order they were bound):

$.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,但如果需要我会升级.

Is there a natural way to reorder event handling? If there isn't, do you know of technique I could apply? I'm using jQuery 1.4.1, though I'll upgrade if I must.

推荐答案

这是我不久前制作的一个简单插件.允许您将处理程序绑定到列表的开头.它非常简单,我不保证它适用于命名空间事件或任何非常奇特的事情.

Here's a simple plugin I did a while back. Lets you bind a handler to the beginning of the list. It is very simple, and I wouldn't guarantee that it works with namespaced events or anything terribly fancy.

对于简单地绑定单个或空间独立的事件组,它应该可以工作.

For simply binding a single or space separate group of events, it should work.

示例: 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, 0, evt.pop());
        }
    });
};

或者,如果您想以其他方式操作处理程序数组,只需获取您想要的元素的处理程序,然后按照您的意愿操作它:

Or if you wanted to manipulate the Array of handlers in some other manner, just get the handlers for the element you want, and manipulate it however you want:

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

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

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

这篇关于附加 jQuery 事件处理程序,以便它们首先被触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆