2009-11-18 5 views
22

Dire que j'ai le plugin jQuery suivant:Appeler un plugin jQuery sans spécifier les éléments

$.fn.myPlugin = function() { 
    //plugin code 
} 

Normalement, vous appelez un plug-in sur un certain nombre d'éléments, comme par exemple:

$("body").myPlugin(); 

Puis-je appeler mon plugin sans spécifier d'élément?

J'ai essayé de l'appeler comme tel: $.myPlugin();, mais cela ne fonctionne pas.

Qu'est-ce qui fonctionne est: $().myPlugin();, mais est-ce la bonne façon de l'invoquer?

Répondre

47

La façon rapide à écrire est ceci:

$.myPlugin = function() { 
    // Plugin code 
} 

Le droit façon d'écrire est la suivante:

(function ($) { 
    $.extend({ 
     myPlugin: function() { 
      // plugin code 
     } 
    }); 
})(jQuery); 

Il peut sembler un peu déroutant au début, mais c'est un motif jQuery commun. Ce code crée une fonction anonyme et l'appelle en argument jQuery comme argument. Dans la fonction, cet argument est lié à $. La raison pour laquelle cela est fait est que cela vous permet de travailler avec le $ même si jQuery fonctionne en mode no-conflict.

La deuxième partie est . Il étend essentiellement l'objet jQuery lui-même, lorsqu'il est appelé avec un seul argument.

Appeler le plug-in (dans le rapide et le droit cas) est la suivante:

$.myPlugin(); 
+0

Je connais ce modèle :) Je ne l'ai simplement pas utilisé dans la question pour éviter l'encombrement du code.Mais merci pour la méthode extend! –

-1

Est-ce que utilise la collection si vous écrivez quelque chose de différent, comme $('a').myPlugin()? Si ce n'est pas le cas, pourquoi le mettez-vous dans $.fn? Peut-être que vous vouliez l'injecter dans jQuery lui-même.

Si elle fonctionne sur une collection, mais parfois une collection vide de sens, alors je pense que votre invocant devrait être $([]) - passer un Array-jQuery vide vous donne une collection vide; ne rien laisser passer semble vous donner une collection contenant document.

+0

Non, il n'a pas besoin tous les éléments sur lesquels travailler; c'est pourquoi j'ai besoin qu'il soit appelé sans aucun élément –

+0

Donc je devrais le changer en '$ .myPlugin = function()' au lieu d'utiliser le 'fn'? parce que je l'ai essayé maintenant comme ça, et je peux en fait l'appeler alors avec la notation que je veux: '$ .myPlugin();' –

+0

Et si j'utilise '$ .myPlugin = function()', sera-t-il encore techniquement appelé un 'plugin'? –

2

Je pense que vous êtes à la recherche jQuery.extend():

jQuery.extend({ 
    func: function() { 
     alert('test'); 
    } 
}); 
$.func(); 
Questions connexes