2010-09-08 2 views

Répondre

10

Oui, c'est possible. Il suffit de passer un tableau de noms d'événement au lieu d'une chaîne:

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

Excellent, j'ai maintenant changé cela pour être la réponse acceptée. Merci à tous ceux qui ont contribué. – delimited

+0

pour jQueryers là: 'node.on ('bind change'.split (' '), function() {});' –

+0

Est-ce que cela fonctionne pour le délégué? – chrisjlee

1

Pourquoi ne pas essayer quelque chose comme ceci:

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

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

(assis à côté de @delimited qui ne peut pas commenter sa question sur), il vient de faire exactement cela ... vient dans l'espoir d'une solution plus élégante –

+0

Ahh ... gotcha. Je pensais qu'il essayait juste de trouver un moyen de déclencher la fonction pour les deux événements. – Pat

+0

Une solution plus élégante serait d'envelopper le tout dans un '(function() {...})()' et de capturer le private var actionFunction comme une fermeture rendant ainsi essentiellement anonyme. C'est ce que le PO est après? Prévenir la pollution de l'espace de noms global? Attends, viens y penser c'est YUI3. Le code est déjà enveloppé dans une fonction. – slebetman

1

EDIT: YUI supporte nativement. Voir la réponse de Ryan ci-dessous.

No. Vous pouvez faire quelque chose comme ça, si:

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); 
}) 

Ce enveloppe le code Node.on() pour accepter une série de types d'événements séparés par des espaces. Il renvoie un objet avec une seule méthode, detach, qui détache votre gestionnaire de tous les événements.

Notez que ce code n'affecte que l'instance Y dans son sandbox, vous devez donc le placer dans la fonction que vous transmettez à YUI().use. Il serait également facile de l'emballer comme un module.

+0

Bonne réponse, merci. – delimited

+1

En fait, c'est possible. Tout ce que vous devez faire est de passer un tableau de types d'événements. Cette solution est une excellente démonstration de comment il est possible de plier les internes de YUI à votre volonté, cependant. –

Questions connexes