这背后的原因是因为 Twitter Bootstrap 使用that.$element.trigger('hidden.bs.modal')
(第 997 行)来触发它的事件。换句话说,它使用.trigger
.
现在的jQuery跟踪每个元素的事件处理程序(全部.on
或.bind
或.click
使用等)._data
。这是因为没有任何其他方法可以获取绑定(使用.addEventListener
)到元素的事件处理程序。所以触发器方法实际上只是从._data(element, 'events')
&._data(element, 'handle')
作为一个数组获取设置的事件侦听器/处理程序并运行它们中的每一个。
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
}
(第 4548 行)
这意味着无论什么上下文,如果一个事件是通过.addEventListener
它绑定的,它就不会使用.trigger
. 这是一个例子。仅在加载jquery
时记录(由 触发.trigger
)。a
但是,如果您单击该元素,两者都会运行。
$('a')[0].addEventListener('click', function(){console.log('addlistener');}, false);
$('a').on('click', function(){
console.log('jquery');
});
$('a').trigger('click');
演示
或者,您可以使用fireEvent
(ie) & dispatchEvent
(non-ie)在 javascript 中的元素上触发事件。我不一定理解或知道 jQuery.trigger
不这样做的原因,但他们可能有也可能没有。经过更多的研究,我发现他们不这样做,因为一些较旧的浏览器每个事件只支持 1 个事件处理程序。
一般来说,我们没有尝试实现仅适用于某些浏览器(和某些事件)而不是所有浏览器的功能,因为有人会立即提交无法正常工作的错误。
虽然我不推荐它,但您可以通过对引导程序代码进行最少的更改来解决此问题。您只需要确保首先附加下面的函数(否则您将有听众触发两次)。
$(modalID).on('hidden.bs.modal', function (e, triggered) {
var event; // The custom event that will be created
if(!triggered){
return false;
}
e.preventDefault();
e.stopImmediatePropagation();
if (document.createEvent) {
event = document.createEvent("HTMLEvents");
event.initEvent("hidden.bs.modal", true, true);
} else {
event = document.createEventObject();
event.eventType = "hidden.bs.modal";
}
event.eventName = "hidden.bs.modal";
if (document.createEvent) {
this.dispatchEvent(event);
} else {
this.fireEvent("on" + event.eventType, event);
}
});
最后将 Twitter Bootstrap 行从上面更改为:
that.$element.trigger('hidden.bs.modal', true)
这是为了让您知道它是被触发的,而不是您自己触发的事件。请记住,我还没有用模态尝试过这段代码。尽管它在click
下面的演示中运行良好,但它可能会或可能不会在模态中按预期工作。
演示