想要颠倒jquery中附加到一个元素的单击事件的顺序

时间:2010-11-16 09:57:06

标签: jquery cross-browser

我有一个场景,我想更改附加到一个元素的点击事件的顺序。我正在使用jquery 1.3.2,我使用以下代码来反转事件的顺序

$("#button").bind('click',first);

var foo = $.data( $('#button').get(0), 'events' ).click;
var firstHandler;
$.each( foo, function(i,defination) {
    firstHandler = defination;
    $('#button').unbind('click', defination);
});

$("#button").bind('click',second);
$("#button").bind('click',firstHandler);

function first() { alert("first"); };
function second() { alert("second"); };

此代码适用于所有其他浏览器(FF,IE,Safari)但在Chrome中无法正常工作。这是我的代码的在线版本,请查看Working code at Online Fiddle

任何人都可以指导我吗?

1 个答案:

答案 0 :(得分:3)

您可以通过取.clicks数组来反转点击,在删除之前复制它,取消绑定点击,然后按相反顺序重新绑定,如下所示:

var clicks = $('#button').data('events').click.slice();
var button = $('#button').unbind('click');
$.each(clicks.reverse(), function() {
    button.click(this);
}); 

You can give it a try here。或者,更通用一点,让它成为一个插件:

$.fn.reverseHandlers = function(eventType) {
  return this.each(function() {
    var handlers = $.data(this, 'events')[eventType].slice();
    var elem = $(this).unbind(eventType);
    $.each(handlers.reverse(), function() {
      elem.bind(eventType, this.handler);
    });    
  });
};

You can test that format here,只需通过以下方式调用:$("#button").reverseHandlers("click");

jQuery 1.3.x用户注意事项:事件结构在1.4+之前的格式不同,如果有人需要一个适用于1.3.x的版本,请在此处发表评论我会添加它。