2014-02-06 60 views
2

我已经将点击处理程序附加到围绕我的无线电输入的div上。当div被点击时,它会设置收音机的检查状态,但是我也想触发绑定到该收音机的所有事件。 有可能是结合到它的多个模块,并且他们有可能被上模糊,改变,单击,DBLCLICK,焦点,悬停等结合触发绑定到元素的所有jQuery事件

现在我可以用下面的代码:

$('.form-type-radio').click(function(){ 
    $(this).find('input').attr('checked', 'checked').trigger('blur').trigger('change').trigger('click').trigger('dblclick').trigger('focus').trigger('hover'); 
}); 

但是,我真的想要一个更简洁的方法 - .trigger('all')将是完美的。

有没有办法做到这一点?

回答

2

或者你可以做到这一点像那样:

DEMO jsFiddle

$('.form-type-radio').click(function (e) { 
    if(e.target != this) return; 
    var input = $(this).find('input')[0], 
     inputEvents = $._data(input, 'events'); 
    $.each(inputEvents, function (k, o) { 
     $(input).triggerHandler(k); 
    }); 
}); 

如果DIV包含的不仅仅是一个输入多个,用for循环:

DEMO jsFiddle

$('.form-type-radio').click(function (e) { 
    if (e.target != this) return; 
    var inputs = $(this).find('input').get(); 
    for (var i = 0, z = inputs.length; i < z; i++) { 
     var inputEvents = $._data(inputs[i], 'events'); 
     $.each(inputEvents, function (k, o) { 
      $(inputs[i]).triggerHandler(k); 
     }); 
    } 
}); 

注意:这只适用于活动boun d使用jQuery。

+0

我是否认为这会触发绑定到包含div .form-type-radio的所有事件?我需要找到该div中的输入并触发绑定到该事件的事件(.find('input'))... –

+0

@FelixEve所以使用精确的选择器。我想'$('。form-type-radio')'是一个无线电输入,而不是DIV。或者如果你在谈论冒泡,使用triggerHandler()代替 –

+0

。form-type-radio是包含div的。我试过使用:var events = $ ._ data($(this).find('input'),'events'), $ self = $(this).find('input'); (事件,函数(k,o){if(k!= e.type) $ self。触发器(K); });我得到TypeError:在jQuery.js中的“line length = object.length,”对象是未定义的。 –

2

不是我会建议,但也许这样的事情

$.fn.triggerAll = function(exclude) { 
    return this.each(function() { 
     for (var key in this) { 
      if (key.indexOf('on') === 0) { 
       var ev = key.replace('on',''); 
       if ($.inArray(ev, exclude) == -1) { 
        $(this).trigger(ev); 
       } 
      } 
     } 
    }); 
}; 

使用像

$('.form-type-radio').click(function(e){ 
    $(this).triggerAll(['click', 'mousedown']); // events not to trigger 
}); 

FIDDLE

我增加了一个选项来传递事件的数组排除,以避免递归问题。

+0

我想用这种方法的问题是触发触发triggerAll()事件,那么你得到一个“太多递归”错误的点击处理程序。也许我应该坚持分别指定每个事件? –

+0

@FelixEve - 这就是我所说的,触发触发事件处理程序等的事件......创建一个循环。 – adeneo

+0

Ar ha - 我没有刷新页面,所以在你后面... –

1

我不认为有一个jQuery函数来做到这一点。一个简单的解决方案是向对象添加一个新事件,以触发所有其他事件。这样,您可以控制触发哪些事件,但不必每次都触发它们。喜欢的东西:

$('input').on('all', function() { 
    $(this) 
     .trigger('blur') 
     .trigger('change') 
     .trigger('click') 
     .trigger('dblclick') 
     .trigger('focus') 
     .trigger('hover'); 
}); 
$('input').trigger('all'); 
+1

如果您不小心,则此方法也容易出现“递归太多”错误。 –

相关问题