2 votes

Ajouter une méthode sur un seul nœud jQuery

Disons que j'ai deux nœuds html comme ceci :

<div class='node a'>one</div>
<input class='node b' value='two'>

et je voudrais ajouter une méthode pour $('.node.a'), mais pas pour le node b. Ce que j'aimerais vraiment faire est quelque chose comme ceci :

$('.node.a').addMethod('val', function() {
  return $('.node.b').val();
});

alert($('.node.a').val()); // alerts 'two'

Il est clair que je ne veux pas surcharger la méthode "val" pour chaque nœud jQuery. Est-il possible de le faire ?

* UPDATE *

Conformément à la suggestion de mgibsonbr, j'ai écrit un plugin jQuery pour faire cela pour moi. Au lieu d'utiliser la méthode jQuery data, je n'exécute la fonctionnalité différente que si le nœud en question est celui qui est appelé. Cela signifie que ce formulaire ne fonctionnera pas pour les listes jquery qui correspondent à plusieurs nœuds html. Le voici :

// overrides a method thats supposed to be called on a single node (a method like val)
$.fn.overrideNodeMethod = function(methodName, action) {
    var originalVal = $.fn[methodName];
    var thisNode = this;
    $.fn[methodName] = function() {
        if (this[0]==thisNode[0]) {
            return action.apply(this, arguments);
        } else {
            return originalVal.apply(this, arguments);
        }
    };
};

1voto

mgibsonbr Points 12998

La seule façon que je connaisse d'ajouter des données spécifiques à un nœud est d'utiliser la fonction data méthode :

$('.node.a').data("val", function() {
    return $('.node.b').val();
});

alert($('.node.a').data("val")());

Ce n'est pas la syntaxe que vous souhaitiez, mais elle fait l'affaire. Une autre option consiste à surcharger val comme l'a suggéré Alex. Par exemple, vous pourriez combiner les deux approches :

var oldVal = $.fn.val;
$.fn.val = function() {
    var custom = $(this).data("val");
    return custom ? custom.apply(this,arguments) : oldVal.apply(this,arguments);
};

alert($('.node.a').val()); // Now it works as intended

Par ici, val fonctionnerait normalement pour la plupart des éléments, ne se comportant différemment que pour ceux pour lesquels vous avez ajouté manuellement une méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X