3

有没有办法结合这两种在jQuery中处理事件附件的方法?

$('selector').on({
    mouseenter: function() {},
    mouseleave: function() {},
    mousedown:  function() {},
    mouseup:    function() {}
});

我更喜欢以前的方法,但需要类似以下的方法来处理“实时”事件(问题是如果处理程序之间有注释,这将不起作用):

$(document).on('mouseenter', 'selector1', function(){})
           .on('mouseleave', 'selector2', function(){})
           .on('mousedown',  'selector3', function(){})
           .on('mouseup',    'selector4', function(){});

但是,是否有解决方法可以做到这一点?:

$(document).on({
    mouseenter: 'selector1': function() {},
    mouseleave: 'selector2': function() {},
    mousedown:  'selector3': function() {},
    mouseup:    'selector4': function() {}
});

更新

我最终得到了这个简单的on-wrapper 函数:https ://gist.github.com/4191657

用法很简单:

$(document).act(
    ['mouseenter', 'selector1', function() {}],
    ['mouseleave', 'selector2', function() {}],
    ['mousedown', 'selector3', function() {}],
    ['mouseup', 'selector4', function() {}]
);

对此有何建议或改进?

4

2 回答 2

3

查看该.on()方法的 jQuery 文档。当您使用您在第一个示例中使用的事件映射版本时,您可以将选择器作为第二个参数传递:

$(document).on({
    mouseenter: function() {},
    mouseleave: function() {},
    mousedown: function() {},
    mouseup: function() {}
}, "selector");

这假设您希望对所有这些事件使用相同的选择器。如果它可能不同,您最好的选择可能是将调用链接到.on()

$(document).on('mouseenter', 'selector1', function(){})
           .on('mouseleave', 'selector2', function(){})
           // ...etc
于 2012-11-28T12:02:47.780 回答
0

我已经设法改进了您的包装函数,以便在定义事件时可以使用对象而不是数组。以类似的方式 Meteor.js 是如何做到的。

// inspired by https://gist.github.com/yckart/4191657
// This code allows you to use more easy to read syntax to define events in jQuery
// Usage:
// $(document).events({
//  'click, .target-selector': function() {
//      //your function to trigger when target selector is clicked
//  }
// });

;(function($) {
    $.fn.events = function() {
        var argumentsObject = arguments[0];
        return this.each(function() {   
            for (var propertyName in argumentsObject) {
                if (argumentsObject.hasOwnProperty(propertyName)) {
                    var argumentsToPass = propertyName.split(", ");
                    argumentsToPass.push(argumentsObject[propertyName]);
                    $(this).on(argumentsToPass[0], argumentsToPass[1], argumentsToPass[2]);
                }
            }
        });
    };
})(jQuery);
于 2016-02-04T18:01:09.380 回答