2010-09-22 2 views
2

Je suis sur le point de porter une série de mes projets jQuery sur Vanilla Javascript (javascript pur, pas de framework) et je voudrais savoir s'il existe des [framework adaptateurs/adaptatifs agnostiques framework] existants?Agnostic Javascript Framework Adaptateur pour jQuery et Mootools?

Par exemple, je suis envisager quelque chose comme ceci:

// My Project 
(function(){ 
    // Fetch all the elements using Sizzle Selector System 
    var $els = Agnostic.find('.penguins'); 
    $els.hide(); 

    // Perform a Ajax Request 
    Agnostic.ajax({ 
     dataType: 'json', 
     sucess: function(){ 

     }, 
     error: function(){ 

     } 
    }); 
}); 

/** 
* Our Agnostic Framework 
* Provides a framework agnostic interface for jQuery and MooTools 
*/ 
var Agnostic = { 
    framework: null, 
    Framework: null, 

    /** 
    * Initialise our Agnostic Framework 
    */ 
    init: function(){ 
     switch (true) { 
      case Boolean(jQuery||false): 
       Agnostic.Framework = jQuery; 
       Agnostic.framework = 'jQuery'; 
       break; 

      case Boolean(MooTools||false): 
       // Check for Sizzle 
       if (typeof Sizzle === 'undefined') { 
        throw new Error('MooTools interface requires the Sizzle Selector Engine.'); 
       } 
       Agnostic.Framework = MooTools; 
       Agnostic.framework = 'MooTools'; 
       break; 

      default: 
       throw new Error('Could not detect a framework.'); 
       break; 
     } 
    } 

    /** 
    * Our Element Object 
    * Used to Wrap the Framework's Object to provide an Agnostic API 
    */ 
    Element: { 
     /** 
     * Create the Element Wrapper 
     */ 
     create: function(Object){ 
      var El = new Agnostic.Element; 
      El.Object = Object; 
     }, 

     /** 
     * Hide the Element 
     */ 
     hide: function(){ 
      switch (Agnostic.framework) { 
       case 'jQuery': 
        this.Object.hide(); 
        break; 

       case 'MooTools': 
        this.Object.setStyle('display','none'); 
        break; 
      } 
     }, 

     /** 
     * Show the Element 
     */ 
     show: function(){ 
      switch (Agnostic.framework) { 
       case 'jQuery': 
        this.Object.show(); 
        break; 

       case 'MooTools': 
        this.Object.setStyle('display',''); 
        break; 
      } 
     } 
    }, 

    /** 
    * Fetch elements from the DOM using the Sizzle Selector Engine 
    */ 
    find: function(selector){ 
     var Element = null; 

     // Fetch 
     switch (Agnostic.framework) { 
      case 'jQuery': 
       Element = jQuery(selector); 
       break; 

      case 'MooTools': 
       Element = new Elements(new Sizzle(selector)); 
       break; 
     } 

     // Wrap 
     Element = Agnostic.Element.create(Element); 

     // Return Element 
     return Element; 
    }, 

    /** 
    * Perform an Ajax Request 
    * We use the jQuery.ajax interface here 
    * But they are more or less the same 
    */ 
    ajax: function(request){ 
     // Send Request 
     switch (Agnostic.framework) { 
      case 'jQuery': 
       jQuery.ajax(request); 
       break; 

      case 'MooTools': 
       (new Request(request)).send(); 
       break; 
     } 

     // Wrap 
     Element = Agnostic.Element.create(Element); 

     // Return Element 
     return Element; 
    } 
}; 
+0

Je ne comprends pas, vous voulez un cadre qui ressemble comme jQuery, sent jQuery, goûte même jQuery ... Pourquoi ne pas simplement utiliser jQuery ... –

+1

@Andrew - Parce qu'il ne veut pas être dépendant du framework. –

+0

@Andrew - Chase est sur place. Je vais porter mes plugins jQuery existants à vanilla javascript donc 90% du code n'utilisera pas de framework, pour les choses où ne pas utiliser un framework est irréalisable comme les sélecteurs et la manipulation DOM (comme les faire dans vanilla js est atroce) quantité de code doit utiliser un adaptateur de cadre agnostique. Le choix d'avoir l'interface principalement jQuery est dû à la part de marché importante de jQuery, et est donc une bonne décision d'adoption. En ce qui concerne le portage de mes plugins dans les versions jQuery et MooTools - il est loin d'être idéal de devoir gérer deux bases de code – balupton

Répondre

3

Je ne l'ai pas vu un « pont-cadre » pré-emballés. Il y a une bonne discussion sur l'abstraction du cadre de votre application par Nicholas C. Zakas. C'est vraiment bon et en profondeur concernant l'importance de séparer votre cadre de votre application.

http://developer.yahoo.com/yui/theater/video.php?v=zakas-architecture

+0

+1 Une conversation fascinante qui mérite d'être écoutée pour tout développeur JavaScript avancé! Merci pour le lien! Bien qu'il ne soit que vaguement lié à cette question, je ne peux malheureusement pas l'accepter comme une réponse. Encore merci pour le lien, va certainement améliorer mon code à l'avenir. – balupton

+0

Regarder la fin de la conversation couvre cette question en fournissant une réponse alternative. Je vais attendre environ une semaine pour voir ce que les autres ont proposé, mais c'est une bonne réponse acceptable. Merci. – balupton

0

Je crois que vous trouverez peut-être la nouvelle (version alpha) de FuseJS être exactement le genre de chose que vous recherchez.

Je cite la première ligne du readme:

frameworks JavaScript partager similaires caractéristiques et fonctionnalités, telles que manipulation DOM, l'enregistrement des événements, et moteurs sélecteur CSS. FuseJS tente d'incorporer les forces de ces cadres dans un environnement stable, efficace, et optimisé core JavaScript.

Il est également intéressant en raison de sa fonctionnalité sandboxed natives. (Ce qui est une bibliothèque autonome aussi!) Je n'ai pas encore eu l'occasion de jouer avec eux (c'est-à-dire benchmark et test de navigateur) mais le concept est très astucieux. (Fondamentalement, il utilise un assortiment de trucs pour fournir un moyen d'étendre Array, Object, etc, sans étendre les versions globales de ces objets.Intrigué encore?)

+0

J'ai échoué à voir comment FuseJS se rapporte à un concept de pont/adaptateur, pour moi, il semble juste comme un autre cadre juste comme jQuery ou MooTools. La question est de faire fonctionner votre plugin avec jQuery et MooTools avec le moins de code possible en utilisant un pont. – balupton

+1

@balupton - Excuses; à partir de votre question et de vos commentaires, il semblait que ce que vous recherchiez était quelque chose qui vous permettrait d'utiliser le moteur de sélection de jQuery, les classes Mootools, le système Dojo.include et Dojo.require, et les extensions Array de Prototype all dans un paquet. FuseJS est la seule chose que je connaisse et qui essaye de faire quelque chose, même de loin, comme ça. (Sauf si vous comptez bien sûr le système moo4q - mais ce n'est pas ce que vous cherchez non plus, puisqu'il est conçu pour vous permettre d'utiliser * les deux * [plutôt que l'une ou l'autre] bibliothèques pour leurs points forts.) –

+1

@Chase suggéré (excellent exposé par le, +1) - un framework agnostique généralement extensible qui vous permet d'implémenter un système qui ressemble à la section Application Core de l'application de démonstration de Zakas qui n'existe pas dans la nature (au moins , autant que je sache.) Peut-être que c'est un vide qui doit être comblé? –