Twitter的引导.为什么模态事件在JQuery中工作,而不是在纯JS中
Twitter Bootstrap. Why do modal events work in JQuery but NOT in pure JS?
Twitter Bootstrap模式对话框有一组事件,可以与回调一起使用。
下面是一个jQuery的例子: $(modalID).on('hidden.bs.modal', function (e) {
console.log("hidden.bs.modal");
});
然而,当我转录这个方法到JS事件'hidden.bs。modal'不工作。使用'click'可以工作:
document.querySelector(modalID).addEventListener('hidden.bs.modal', function(e) {
console.log("hidden.bs.modal");
}, false);
这些Bootstrap事件只能使用jQuery吗?为什么?
谢谢,
道格
这是因为Twitter Bootstrap使用that.$element.trigger('hidden.bs.modal')
(第997行)来触发它的事件。换句话说,它使用.trigger
。
._data
跟踪每个元素的事件处理程序(所有.on
或.bind
或.click
等)。这是因为没有任何其他方法可以获得绑定(使用.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');
演示或者,你可以在javascript中使用fireEvent
(即)&dispatchEvent
(非ie)。我不一定理解或知道jQuery的经过更多的研究,我发现他们不这样做,因为一些旧的浏览器只支持每个事件1个事件处理程序。.trigger
不这样做的原因,但他们可能有,也可能没有。
一般来说,我们没有尝试实现只在一些浏览器(和一些事件)上工作的功能,但不是所有的,因为有人会立即提交一个错误,它不能正常工作。
虽然我不建议这样做,但您可以通过对引导代码进行少量更改来解决这个问题。您只需要确保下面的函数首先附加(否则将触发两次侦听器)。
$(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
演示中工作得很好,但它可能会或可能不会像预期的那样与模态一起工作。
原生Javascript解决方案。这是我不使用JQuery的方法。
//my code ----------------------------------------
export const ModalHiddenEventListener = (el, fn, owner) => {
const opts = {
attributeFilter: ['style']
},
mo = new MutationObserver(mutations => {
for (let mutation of mutations) {
if (mutation.type === 'attributes'
&& mutation.attributeName ==='style'
&& mutation.target.getAttribute('style') === 'display: none;') {
mo.disconnect();
fn({
owner: owner,
element: mutation.target
});
}
}
});
mo.observe(el, opts);
};
//your code with Bootstrap modal id='modal'-------
const el = document.getElementById('modal'),
onHide = e => {
console.log(`hidden.bs.modal`);
};
ModalHiddenEventListener(el, onHide, this);
兼容性:https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe Browser_compatibility
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- JS可以在Chrome中工作,但不能在Firefox中工作
- JS,用于播放提示音以通知未按预期工作
- JS在firefox中无法正常工作
- 为什么不是'我的JS滑块正在工作
- 谷歌地图Api和JS代码不工作
- 从js引擎的角度来看闭包和构造函数是如何工作的
- 当加载几个js文件时,defer属性应该如何工作
- 这和javascript中的闭包(在纸上工作.js)
- 嘶嘶声中的正则表达式如何工作.js
- 第一个现实生活-工作JS脚本.我怎样才能使它更有效率
- 简单事件侦听器不工作-JS
- 为什么不't工作js调试智能
- 字符串模板不工作- js
- 多维数组indexOf不工作js
- 原型“this"不工作(JS)
- 不能让Autobahn的例子工作(js和python)
- 为什么这个选择器不能工作?JS
- 为什么这个脚本不能工作?(JS)
- Spring MVC 和 Bootstrap - css,img 工作.js不工作