gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:29:43 26 4
gpt4 key购买 nike

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

$.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,但如果必须的话我会升级。

最佳答案

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

对于简单地绑定(bind)单个事件或空间独立的事件组来说,它应该可以工作。

示例: 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());
}
});
};

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

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

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

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

关于jquery - 附加 jQuery 事件处理程序以便首先触发它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com