在YUI3中是否可以将单个处理程序附加到多个事件?

时间:2010-09-08 14:53:16

标签: javascript jquery yui3

这样的事情可能吗?

Y.one("input.units").on("keyup change", function(e){
    ...
});

jquery等价物是

$("input.units").bind("keyup change", function(e){
    ...
});

3 个答案:

答案 0 :(得分:10)

是的,这是可能的。只需传递一组事件名称而不是字符串:

Y.one('input.units').on(['keyup', 'change'], function (e) {
    // ...
});

答案 1 :(得分:1)

为什么不尝试这样的事情:

var actionFunction = function(e) { /* stuff goes here */ };

node.one("input.units").on("keyup", actionFunction);
node.one("input.units").on("change", actionFunction);

答案 2 :(得分:1)

编辑: YUI原生支持此功能。请参阅下面的Ryan的答案。

No。不过你可以这样做:

YUI().use("node", "oop", function (Y) {
var on = Y.Node.prototype.on;

function detachOne(handle) {
    handle.detach();
}

Y.mix(Y.Node.prototype, {
        on: function (type, fn, context) {
            var args = Y.Array(arguments),
                types = args[0].split(" "),
                handles = [];

            Y.each(types, function (type) {
                    args[0] = type;
                    handles.push(on.apply(this, args));
                })

            return {
                detach: Y.bind(Y.each, null, handles, detachOne)
            };
        }
    }, true);
})

此代码包装Node.on()以接受一系列以空格分隔的事件类型。它返回一个带有单个方法的对象detach,它将处理程序与所有事件分离。

请注意,此代码仅影响其沙箱中的Y实例,因此您应将其放在传递给YUI().use的函数中。将它打包成模块也很容易。