2010-10-04 4 views
1

Quelle est la meilleure façon de créer un wrapper agnostique de bibliothèque pour les sélecteurs de bibliothèque JS? J'ai un framework JS personnalisé, qui vise à être aussi indépendant des bibliothèques que possible. Le problème que j'ai est que par exemple Mootools améliore l'élément DOM retourné avec ses propres méthodes spécifiques (injecter, adopter etc.), et je ne veux pas que ceux-ci soient visibles par les modules, superposés sur le framework (comme Nicholas Zakas une fois décrit), pour éviter les abus/accidents. En guise de simple secourisme, j'ai créé un sélecteur personnalisé qui utilise Mootools, puis crée un élément DOM-objet/wrapper personnalisé et Mootools DOM sélectionné (et amélioré), donc les méthodes améliorées de Mootools ne sont pas directement visibles. aux modules ci-dessus. Le problème avec cette approche est que je perds toutes les fonctionnalités natives de l'élément DOM (valeur, style, etc.) si ce n'est pas spécifiquement codé dans le wrapper (Element).Comment faire wrapper sélecteur agnostique bibliothèque JS?

Existe-t-il une autre et/ou une meilleure façon de procéder? Quelque chose qui étendrait l'élément DOM natif, fournissant ainsi automatiquement les propriétés/méthodes natives ET offrant des fonctionnalités avancées à travers le wrapper (via Mootools, jQuery, whatnot ...).

quelques exemples de code, comment il est fait actuellement:

/* 
* Wrap the native library element 
*/ 
Element = function(_libElement) { 
    // Store native object 
    var libElement = _libElement; 

    return { 
     addClass: function(_class) { libElement.addClass(_class); return this; }, 
     removeClass: function(_class) { libElement.removeClass(_class); return this; }, 
     hasClass: function(_class) { return libElement.hasClass(_class); } 
    }; 
}; 

/* 
* Custom selector 
*/ 
getElement = function(_query) { 
    var elements = $$(_query); 

    // Wrap each element to Element wrapper 
    var num = elements.length; 
    while(num--) { 
     elements[num] = new Element(elements[num]); 
    } 

    return elements; 
}; 
+0

Pouvez-vous fournir du code? Je n'arrive pas à visualiser exactement ce dont vous avez besoin ... –

+0

Ajout d'un exemple de code – crappish

Répondre

1

Mon approche serait de ne pas se soucier, juste passer Repositionner le DOM natif. Si quelqu'un veut s'appuyer sur les améliorations de MooTools (ou de Prototype) sur cet élément DOM, c'est son propre lookout. En fait, si vous essayez d'empêcher la diffusion de ces améliorations, je dirais que vous n'êtes plus en mode bibliothèque.   — À la place, vous êtes activement discriminatoire (à défaut d'un meilleur mot!) Contre les bibliothèques natives amélioration de l'élément. :-) Quelqu'un utilisant ces bibliothèques veut probablement ces améliorations.

Si quelqu'un construit des modules sur le dessus de votre bibliothèque, ils doivent être conscients de l'environnement sur lequel ils construisent (ce qui ne garantit pas que ces améliorations existent).

Un peu hors sujet, mais il est probablement intéressant de noter que l'extension directe des éléments DOM semble être démodée. Je sais que les prototypes prévoient activement d'utiliser des wrappers (a'la jQuery) dans le temps.

+0

Ce serait exactement l'idée, pour empêcher l'utilisation de l'amélioration spécifique à la bibliothèque. Je pense qu'une telle approche (en remettant juste l'élément de bibliothèque natif) serait une implémentation plutôt bâclée et finirait par causer des problèmes sur toute la ligne (lignes qui finissent par utiliser directement la bibliothèque) lors du passage d'une bibliothèque à une autre. Le framework est actuellement strictement interne, donc tout le code sera écrit en tant que bibliothèque agnostique dès le départ. – crappish

+0

@crappish: Mais vous n'êtes * pas * agnostique vis-à-vis de la bibliothèque si vous empêchez l'utilisation de bibliothèques qui étendent les éléments DOM; vous êtes biaisé contre certaines bibliothèques en faveur des autres. Mais si vous voulez vraiment aller dans cette direction, vous n'avez pas d'autre choix que d'utiliser un wrapper et d'empêcher les clients d'utiliser l'élément DOM brut. Ça va être cher, parce que si vous cachez l'élément, alors * tout * doit passer par votre wrapper, chaque propriété et chaque fonction. Ce sera un problème d'entretien, c'est le moins qu'on puisse dire. (Suite) –

+2

(continue) Je préfère l'approche de jQuery: vous obtenez un emballage, 99% du temps c'est tout ce dont vous avez besoin, mais vous pouvez obtenir l'élément brut si vous en avez besoin. –

Questions connexes