你所说的区别可能是“捕获”事件模型或“冒泡”事件模型之间的差异。jQuery的trigger操作基于冒泡模型,可能是因为这是更受支持的事件模型,主要归功于Internet Explorer。冒泡模型仅向上遍历元素的父级...这就是当从div1触发时,你的事件不会在div2上触发的原因,因为它始终向上冒泡而不是向下。我以前没有尝试过使用原生函数进行自定义事件,但是大多数现代浏览器在设置事件监听器时允许您决定使用哪种类型的模型。
addEventListener (type, listener[, useCapture])
https://developer.mozilla.org/zh-CN/docs/DOM/element.addEventListener
如果将最后一个参数设为 true
,则事件侦听器应在捕获阶段触发(即事件向下遍历DOM树时)。如果设置为 false,则事件将在冒泡阶段触发,该阶段在向上遍历DOM树时发生。
这里讨论了这个问题:
事件捕获与事件冒泡
正如我所说,我不确定这对于专门定制的事件是否有效。我非常确定您不能使用jQuery(至今)来实现此目的,可能是因为旧浏览器缺乏支持。
更正
显然,我之前猜测的方法行不通。我认为这是由于“捕获”一词让你想到捕获用户输入 - 当涉及定制事件时,没有办法定义新的用户输入类型。因此,我编写了这个快速的jQuery插件... 它只经过了大致测试,但逻辑应该是正确的 - 希望它有用:
$.fn.unbubble = function( eventNames ){
var names = eventNames.split(' '),
non = names.length,
args = Array.prototype.slice.call(arguments);
var trigger = function(){
var i, events, elm = $(this);
if ( $._data ) {
if ( (events = $._data(this, 'events')) ) {
for ( i=0; i<non; i++ ) {
if ( names[i] && ( names[i] in events ) ) {
elm.triggerHandler.apply(elm, args);
break;
}
}
}
}
else {
elm.triggerHandler.apply(elm, args);
}
elm.children().each(trigger);
};
this.each(trigger);
}
$(function(){
$('.div2').bind('customEvent', function(){
alert('I should trigger!');
});
$('#div1').unbubble( 'customEvent' );
});