Comment créer une fonction jQuery (une nouvelle méthode ou plugin jQuery)?

203

Je sais qu'en JavaScript, la syntaxe est la suivante:

function myfunction(param){
  //some code
}

Existe-t-il un moyen de déclarer une fonction dans jQuery qui peut être ajoutée à un élément? Par exemple:

$('#my_div').myfunction()
multimediaxp
la source
6
@RedEyedMonster - cela a beaucoup de sens. Avez-vous déjà utilisé quelque chose comme jQuery datepicker? $('#myDatePickerfield').datePicker();
Jamiec
Non, je ne l'ai pas fait mais merci de m'avoir alerté :)
RedEyedMonster
3
@RedEyedMonster - Vous avez probablement utilisé $("#someElement").hide()ou .addClass()...
nnnnnn
@RedEyedMonster: l'OP décrit les plugins jQuery, qui sont en fait assez courants en JavaScript. Voir docs.jquery.com/Plugins/Authoring
Paul D. Waite

Réponses:

286

Depuis les documents :

(function( $ ){
   $.fn.myfunction = function() {
      alert('hello world');
      return this;
   }; 
})( jQuery );

Alors tu fais

$('#my_div').myfunction();
Candide
la source
61
Juste pour ajouter quelque chose que je pensais important: veuillez ajouter - retourner ceci; après l'alerte. Cela rendra la fonction chaînable.
Potheek
2
Beaucoup de bonnes réponses ici. Le jQuery-Docu montre les différences: learn.jquery.com/plugins/basic-plugin-creation
Andy Tschiersch
@candide à quel moment $('my_div').myfunction(); sera appelé
Nikhil G
2
@NikhilG $ ('my_div') fait référence à une balise <my_div></my_div>. Vous avez besoin du signe de hachage pour faire référence à l'id my_div.
Candide
6
C'est un exemple étrange car il n'a vraiment rien à voir avec cet élément.
sheriffderek
78

Malgré toutes les réponses que vous avez déjà reçues, il convient de noter que vous n'avez pas besoin d'écrire un plugin pour utiliser jQuery dans une fonction. Certes, s'il s'agit d'une fonction simple et unique, je pense que l'écriture d'un plugin est exagérée. Cela pourrait être fait beaucoup plus facilement en passant simplement le sélecteur à la fonction en tant que paramètre . Votre code ressemblerait à ceci:

function myFunction($param) {
   $param.hide();  // or whatever you want to do
   ...
}

myFunction($('#my_div'));

Notez que le $dans le nom de variable $paramn'est pas requis. C'est juste une de mes habitudes pour qu'il soit facile de se rappeler que cette variable contient un sélecteur jQuery. Vous pouvez également l'utiliser param.

Pevara
la source
41

Bien qu'il existe une pléthore de documentation / tutoriels, la réponse simple à votre question est la suivante:

// to create a jQuery function, you basically just extend the jQuery prototype
// (using the fn alias)

$.fn.myfunction = function () {
    // blah
};

À l'intérieur de cette fonction, la thisvariable correspond à l'ensemble encapsulé jQuery sur lequel vous avez appelé votre fonction. Donc quelque chose comme:

$.fn.myfunction = function () {
    console.log(this.length);
};

$('.foo').myfunction();

... affichera sur la console le nombre d'éléments avec la classe foo.

Bien sûr, il y a un peu plus dans la sémantique que cela (ainsi que les meilleures pratiques et tout ce jazz), alors assurez-vous de le lire.

Richard Neil Ilagan
la source
14

Pour rendre une fonction disponible sur les objets jQuery, vous l'ajoutez au prototype jQuery (fn est un raccourci pour le prototype dans jQuery) comme ceci:

jQuery.fn.myFunction = function() {
    // Usually iterate over the items and return for chainability
    // 'this' is the elements returns by the selector
    return this.each(function() { 
         // do something to each item matching the selector
    }
}

Ceci est généralement appelé un plugin jQuery .

Exemple - http://jsfiddle.net/VwPrm/

Richard Dalton
la source
8

Yup - ce que vous décrivez est un plugin jQuery.

Pour écrire un plugin jQuery, vous créez une fonction en JavaScript et l'assignez à une propriété sur l'objet jQuery.fn.

Par exemple

jQuery.fn.myfunction = function(param) {
    // Some code
}

Dans votre fonction de plugin, le thismot clé est défini sur l'objet jQuery sur lequel votre plugin a été invoqué. Donc, quand vous le faites:

$('#my_div').myfunction()

Ensuite, thisinside myfunctionsera défini sur l'objet jQuery retourné par $('#my_div').

Voir http://docs.jquery.com/Plugins/Authoring pour l'histoire complète.

Paul D. Waite
la source
8
$(function () {
    //declare function 
    $.fn.myfunction = function () {
        return true;
    };
});

$(document).ready(function () {
    //call function
    $("#my_div").myfunction();
});
user1619962
la source
Je ne pense pas que le décalage dans la fermeture des parenthèses et des accolades soit le seul problème avec ce code. S'il-vous-plaît, réparez.
Christoffer Lette
6

Vous pouvez également utiliser extend (la façon dont vous créez des plugins jQuery):

$.fn.extend(
{
    myfunction: function () 
    {
    },

    myfunction2: function () 
    {
    }
});

Usage:

$('#my_div').myfunction();
Novasol
la source
5

Vous pouvez écrire vos propres plugins jQuery (fonction qui peut être appelée sur des éléments sélectionnés) comme ci-dessous:

(fonction ($) {
    $ .fn.myFunc = fonction (param1, param2) {
        // this - l'objet jquery contient vos éléments sélectionnés
    }
}) (jQuery);


Appelez-le plus tard comme:

$ ('div'). myFunc (1, null);
Michael
la source
4

Oui, les méthodes que vous appliquez aux éléments sélectionnés à l'aide de jquery sont appelées plugins jquery et il existe une bonne quantité d'informations sur la création dans les documents jquery.

Il vaut la peine de noter que jquery est juste javascript, donc il n'y a rien de spécial à propos d'une "méthode jquery".

Jamiec
la source
1
'il n'y a rien de spécial dans une "méthode jquery"' - Oui, il y a: une "méthode jQuery" fonctionne sur un objet jQuery. (Mais oui, jQuery est juste JS ...)
nnnnnn
3

Créez une méthode de "colorisation":

$.fn.colorize = function custom_colorize(some_color) {
    this.css('color', some_color);
    return this;
}

Utilise le:

$('#my_div').colorize('green');

Cet exemple simple combine le meilleur de Comment créer un plugin de base dans les documents jQuery et les réponses de @Candide , @Michael .

Bob Stein
la source
3

Vous pouvez toujours faire ceci:

jQuery.fn.extend({
   myfunction: function(param){
       // code here
   },
});
OR
jQuery.extend({
   myfunction: function(param){
       // code here
   },
});
$(element).myfunction(param);

la source
2

Il semble que vous souhaitiez étendre l'objet jQuery via son prototype (c'est-à-dire écrire un plugin jQuery ). Cela signifierait que chaque nouvel objet créé en appelant la fonction jQuery ( $(selector/DOM element)) aurait cette méthode.

Voici un exemple très simple:

$.fn.myFunction = function () {
    alert('it works');
};

Démo

jbabey
la source
1

L'exemple le plus simple pour créer une fonction dans jQuery est

jQuery.fn.extend({
    exists: function() { return this.length }
});

if($(selector).exists()){/*do something here*/}
Chintan Thummar
la source