2010-09-08 53 views

回答

10

是的,这是可能的。只是通过事件名称的数组,而不是字符串:

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

非常好,我现在已经改变这是被接受的答案。感谢所有贡献的人。 – delimited 2010-10-11 11:23:50

+0

jQuery的那里:'node.on('bind change'.split(''),function(){});' – 2011-11-18 20:13:15

+0

这是否也适用于委托? – chrisjlee 2015-01-14 21:38:29

1

为什么不尝试这样的事:

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

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

(坐在旁边的@delimited谁也不能在他对问题的评论)一个更优雅的解决方案,他只是做正是......只是希望 – 2010-09-08 15:02:34

+0

啊......呃。我以为他只是试图找出一种方法来让这两个事件的功能发射。 – Pat 2010-09-08 15:17:50

+0

一个更优雅的解决方案是将整个东西包装在一个'(function(){...})()'中,并将私有'var actionFunction'作为一个闭包,从而使其基本上是匿名的。这是OP的正确之后?防止全球命名空间污染?等等,来想一想这是YUI3。代码已经包装在一个函数中。 – slebetman 2010-09-08 15:55:08

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函数内。将它打包成模块也很容易。

+0

很好的答案,谢谢。 – delimited 2010-09-22 10:19:34

+1

其实,这是可能的。您只需传递一组事件类型即可。尽管如此,这个解决方案很好地展示了如何将YUI的内部结构屈服于自己的意愿。 – 2010-10-09 00:09:49

相关问题