【问题标题】:jQuery event delegation with many events and handlers带有许多事件和处理程序的 jQuery 事件委托
【发布时间】:2014-05-15 00:34:45
【问题描述】:

我的问题与空间和可读性有关,但我开始了。

我需要使用事件委托来让动态添加的元素与我的 jQuery 函数一起使用。但是,我希望结合两种处理事件的方式。基本上我想要这个:

$("div").on({
    mouseenter: function() {
        console.log( "hovered over a div" );
    },
    mouseleave: function() {
        console.log( "mouse left a div" );
    },
    click: function() {
        console.log( "clicked on a div" );
    }
});

但我想使用事件委托并为每个事件设置选择器:

$("ul").on("click", "li", function() {
    console.log( "Something in a <ul> was clicked, and we detected that it was an <li> element.");
});

结论:使用第一个示例时是否可以进行事件委托? 我想要的示例:

$("div").on({
    mouseenter, 'div': function() {
        console.log( "hovered over a div" );
    },
    mouseleave, 'tr, td, div': function() {
        console.log( "mouse left a div" );
    },
    click, 'td div': function() {
        console.log( "clicked on a div" );
    }
});

【问题讨论】:

  • Edit 修复了一些大写字母和代码上的一些缩进。猜猜它让整个事情看起来更干净了,thnx ;)

标签: jquery events delegation handlers


【解决方案1】:

是的,但是语法有点不同,你不能为每个事件挑选选择器

$('ul').on({
    mouseenter: function() {
        console.log( "hovered over a LI" );
    }, 
    mouseleave: function() {
        console.log( "mouse left a LI" );
    },
    click: function() {
        console.log( "clicked on a LI" );
    }
}, 'li');

如果您真的必须为每个事件过滤不同的元素,您可以执行类似的操作

$('div').on({
    mouseenter: function(e) {
        if (e.target.tagName.toLowerCase() === 'tr') {
            console.log( "hovered over a TR" );
        }
    },
    mouseleave: function(e) {
        if (e.target.tagName.toLowerCase() === 'div') {
            console.log( "mouse left a DIV" );
        }
    },
    click: function(e) {
        if (e.target.tagName.toLowerCase() === 'TD') {
            console.log( "clicked on a TD" );
        }
    }
});

但这并不比做起来容易

$('div').on('mouseenter', 'tr', function() {
     console.log( "hovered over a TR" );
}).on('mouseleave', 'div', function() {
     console.log( "mouse left a DIV" );
}).on('click', 'td', function() {
     console.log( "clicked on a TD" );
});

【讨论】:

  • 所以不管怎样,我最终都会得到很多代码。如果我不能为每个事件选择一个选择器,我不妨拆分每个事件并为每个事件添加多个选择器。希望有一种更简洁的方式。
  • 不,在对on() 的同一次调用中,无法将每个事件委托给不同的选择器,这与事件处理程序的工作方式有关。
  • 啊,当我检查它时,完整的答案没有发布。第三个选项看起来很棒,看起来足够简洁和整洁。非常感谢 :) 我会在允许的情况下接受您的回答,这正是我正在寻找的信息。
猜你喜欢
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多