2010-09-08 52 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

相關問題