2010-04-01 6 views
2

Tenir compte du code de base suivant:Développer un plugin jQuery qui renvoie un objet donné, au lieu de l'objet jQuery lui-même!

(function($) { 
    $.fn.myPlugin = function(settings) { 
     return this.each(function() { 
      //whatever 
     }); 
    }; 
}); 

Le plugin retourne un objet jQuery. La question est de savoir comment suis-je censé écrire un plug-in qui retourne un objet personnalisé afin que je puisse faire quelque chose comme ceci:

var api = $('div.myelement').myPlugin(); 
api.onMyEventName(function(e, whateverParam) { 
    //whatever 
}); 

Il serait très apprécié si vous pouvez écrire quelques lignes de code qui me décrit comment pour ce faire, comment appeler la fonction onMyEventName sur un objet API personnalisé ...

Merci.

+3

Pourquoi ne pouvez-vous pas simplement renvoyer votre objet? – Jeremy

+0

Il pourrait freiner le contrat de conception JQuery, mieux vaut demander. –

Répondre

14
(function($) { 
    function MyApi($this, settings) { 
     this.$this = $this; 
     this.settings = settings; 
    }; 

    MyApi.prototype.output = function (val) { 
     // use this.$this to access the original jQuery object 

     return this.settings[val]; 
    }; 

    $.fn.myPlugin = function(settings) { 
     return new MyApi(this, settings); 
    }; 
}); 

Remarque que nous avons passé this de $.fn.myPlugin() dans le constructeur MyApi; Cela vous permet d'accéder à l'objet jQuery auquel myPlugin() a été appelé à l'origine dans les méthodes MyApi.

Vous pouvez également faire la même chose en utilisant la syntaxe littérale:

(function($) { 
    $.fn.myPlugin = function(settings) { 
     return { 
      settings: settings, 
      output: function (val) { 
       // use this.$this to access the original jQuery object 

       return this.settings[val]; 
      }, 
      $this: this 
     }; 
    }; 
}); 

Ensuite;

var something = $('#something').myPlugin({ 
    val: 'Lemon' 
}); 

alert(something.output('val')); // Lemon 

... encore une fois, nous avons capturé la valeur de this (l'objet jQuery) dans une propriété $this sur le nouvellement construit objecté, pour accéder à l'objet jQuery d'origine.

+1

En supposant que vous accédiez à votre objet via des sélecteurs JQuery, car ils sont liés aux nœuds sélectionnés, le fichier '$ .fn.myPlugin' devrait fournir les nœuds (' this') au contrôleur MyApi. Aussi '$ .fn.myPlugin' devrait utiliser $ .map (this, ...) pour que tous les éléments correspondant au sélecteur soient traités avec MyApi ... –

+0

@VajkHermecz: c'était un peu un exemple inventé utilisé, mais non-le-moins, vous avez raison de passer normalement 'this'; J'ai mis à jour le code en conséquence. En ce qui concerne l'utilisation de 'map()' (infact, 'each()' est plus courant), je laisse cela au lecteur pour voir s'il en a besoin ou pas; cela dépend de l'usecase! – Matt

0

Il existe un great article by Hector Virgen détaillant une solution possible (également utilisée dans bootstrap) pour répondre à cette question.

Le moment clé stocke essentiellement votre objet API dans la section de données du nœud:

$.fn.myplugin = function() { 
    return $.each(function() { 
     ... 
     myplugin = new MyPlugin(this) 
     ... 
     $(this).data('myplugin', myplugin); 
    } 
} 

Après cela, les utilisateurs peuvent facilement accéder à l'objet par:

$(this).data("myplugin") 

Une extension peut-être utile à cette solution pourrait définir une méthode mypluginapi comme un raccourci, pour accéder à votre objet API:

$.fn.mypluginapi = function() { 
    return $(this).myplugin().data('myplugin') 
} 
Questions connexes