Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jquery立即调用文档的click handler_Javascript_Jquery_Ember.js_Event Handling_Click - Fatal编程技术网

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);
        },