Javascript 使用jquery立即调用文档的click handler
每当单击菜单按钮时,将注册一个单击处理程序,当单击发生在正文中的任何其他位置时,将取消注册该单击处理程序。Javascript 使用jquery立即调用文档的click handler,javascript,jquery,ember.js,event-handling,click,Javascript,Jquery,Ember.js,Event Handling,Click,每当单击菜单按钮时,将注册一个单击处理程序,当单击发生在正文中的任何其他位置时,将取消注册该单击处理程序。 当我执行Ember.$('body')。时,它工作得非常好,但当我执行Ember.$(document).时,处理程序会在处理程序注册时立即被调用。单击后不会调用处理程序,但在注册时会立即调用!原因是什么?我相信您已使用$('body')。在(“单击“,”。菜单项“,”菜单项“,”菜单单击)或类似的方式附加了菜单单击 现在,当调用menuClick并绑定$(document).on(…在您
当我执行Ember.$('body')。时,它工作得非常好,但当我执行Ember.$(document).时,处理程序会在处理程序注册时立即被调用。单击后不会调用处理程序,但在注册时会立即调用!原因是什么?我相信您已使用$('body')。在(“单击“,”。菜单项“,”菜单项“,”菜单单击)或类似的方式附加了菜单单击 现在,当调用menuClick并绑定$(document).on(…在您的问题中,事件最终将冒泡到您的文档上时,触发单击并调用刚才附加的处理程序 如果您在(…)上绑定到$('body')。则会附加处理程序,但由于事件已经冒泡到body,因此在事件冒泡时不会再次触发该处理程序
您可以只添加一个事件在您的菜单中单击以阻止事件冒泡。我猜ember没有优雅地处理事件委派。但是ember没有处理。它的jquery!嗯,当然。我认为jquery在执行事件处理程序期间无法处理事件附件,事件会传播到新的处理程序并立即触发它。@Bergi可能会请详细说明?如果是这样的话,它为什么会对“body”起作用?我想是因为在
body
上还没有安装click
处理程序,但是在document
上有。原生DOM不会触发在事件传播期间安装的侦听器,但是jQuery只使用它们一次iirc。这听起来不错如果我已经注册了“body”。让我检查并返回:)。我很确定我没有在其他任何地方单独注册body
menuClick: function () {
var _this = this;
var clickNamespace = 'click.menu-item' + this.get('currentComponentIndex');
Ember.$(document).on(clickNamespace, function (event) {
if (!Ember.$(_this.getSourceFromEvent(event)).closest(_this.$('.menu-item')).length) {
Ember.$(document).off(clickNamespace);
_this.set('isSubmenuVisible', false);
}
});
this.set('isSubmenuVisible', true);
},