Wie erstelle ich eine jQuery-Funktion (eine neue jQuery-Methode oder ein neues Plugin)?

203

Ich weiß, dass die Syntax in JavaScript wie folgt lautet:

function myfunction(param){
  //some code
}

Gibt es eine Möglichkeit, eine Funktion in jQuery zu deklarieren, die einem Element hinzugefügt werden kann? Beispielsweise:

$('#my_div').myfunction()
multimediaxp
quelle
6
@ RedEyedMonster - es macht viel Sinn. Haben Sie jemals etwas wie jQuery Datepicker verwendet? $('#myDatePickerfield').datePicker();
Jamiec
Nein, habe ich nicht, aber danke, dass du mich darauf aufmerksam gemacht hast :)
RedEyedMonster
3
@ RedEyedMonster - Sie haben wahrscheinlich verwendet $("#someElement").hide()oder .addClass()...
nnnnnn
@RedEyedMonster: Das OP beschreibt jQuery-Plugins, die in JavaScript eigentlich ziemlich häufig sind. Siehe docs.jquery.com/Plugins/Authoring
Paul D. Waite

Antworten:

286

Aus den Dokumenten :

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

Dann tust du es

$('#my_div').myfunction();
Candide
quelle
61
Nur um etwas hinzuzufügen, das ich für wichtig hielt: Bitte hinzufügen - geben Sie dies zurück; nach dem Alarm. Dadurch wird die Funktion verkettbar.
Potheek
2
Viele richtige Antworten hier. Das jQuery-Docu zeigt die Unterschiede: learn.jquery.com/plugins/basic-plugin-creation
Andy Tschiersch
@andide an welchem ​​Punkt $('my_div').myfunction(); wird angerufen
Nikhil G
2
@NikhilG $ ('my_div') bezieht sich auf ein Tag <my_div></my_div>. Sie benötigen dort das Hash-Zeichen, um auf die ID zu verweisen my_div.
Candide
6
Dies ist ein seltsames Beispiel, weil es für dieses Element eigentlich nichts bedeutet.
Sheriffderek
78

Trotz aller Antworten, die Sie bereits erhalten haben, ist es erwähnenswert, dass Sie kein Plugin schreiben müssen, um jQuery in einer Funktion zu verwenden. Wenn es sich um eine einfache, einmalige Funktion handelt, halte ich das Schreiben eines Plugins für übertrieben. Dies könnte viel einfacher geschehen, indem der Selektor einfach als Parameter an die Funktion übergeben wird . Ihr Code würde ungefähr so ​​aussehen:

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

myFunction($('#my_div'));

Beachten Sie, dass der $Name der Variablen $paramnicht erforderlich ist. Es ist nur eine Gewohnheit von mir, sich leicht daran zu erinnern, dass diese Variable einen jQuery-Selektor enthält. Sie könnten genauso paramgut verwenden.

Pevara
quelle
41

Es gibt zwar eine Vielzahl von Dokumentationen / Tutorials, aber die einfache Antwort auf Ihre Frage lautet:

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

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

Innerhalb dieser Funktion thisentspricht die Variable der von jQuery umschlossenen Menge, für die Sie Ihre Funktion aufgerufen haben. Also so etwas wie:

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

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

... spült die Anzahl der Elemente mit der Klasse in die Konsole foo.

Natürlich hat die Semantik ein bisschen mehr zu bieten (als auch Best Practices und all diesen Jazz). Lesen Sie sie also unbedingt durch.

Richard Neil Ilagan
quelle
14

Um eine Funktion für jQuery-Objekte verfügbar zu machen, fügen Sie sie dem jQuery-Prototyp hinzu (fn ist eine Verknüpfung für den Prototyp in jQuery).

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
    }
}

Dies wird normalerweise als jQuery-Plugin bezeichnet .

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

Richard Dalton
quelle
8

Ja - was Sie beschreiben, ist ein jQuery-Plugin.

Um ein jQuery-Plugin zu schreiben, erstellen Sie eine Funktion in JavaScript und weisen sie einer Eigenschaft für das Objekt zu jQuery.fn.

Z.B

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

Innerhalb Ihrer Plugin-Funktion wird das thisSchlüsselwort auf das jQuery-Objekt gesetzt, für das Ihr Plugin aufgerufen wurde. Also, wenn Sie tun:

$('#my_div').myfunction()

Dann wird thisinside myfunctionauf das von zurückgegebene jQuery-Objekt gesetzt $('#my_div').

Die vollständige Geschichte finden Sie unter http://docs.jquery.com/Plugins/Authoring .

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

$(document).ready(function () {
    //call function
    $("#my_div").myfunction();
});
user1619962
quelle
Ich denke nicht, dass die Nichtübereinstimmung beim Schließen von Parens und Klammern die einzigen Probleme mit diesem Code sind. Bitte repariere.
Christoffer Lette
6

Sie können auch expand verwenden (die Art, wie Sie jQuery-Plugins erstellen):

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

    myfunction2: function () 
    {
    }
});

Verwendung:

$('#my_div').myfunction();
Novasol
quelle
5

Sie können Ihre eigenen jQuery-Plugins (Funktion, die für ausgewählte Elemente aufgerufen werden kann) wie folgt schreiben:

(Funktion ($) {
    $ .fn.myFunc = Funktion (param1, param2) {
        // this - jquery object enthält Ihre ausgewählten Elemente
    }}
}) (jQuery);


Nennen Sie es später wie:

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

Ja, Methoden, die Sie auf Elemente anwenden, die mit jquery ausgewählt wurden, werden als jquery-Plugins bezeichnet, und in den jquery-Dokumenten finden Sie zahlreiche Informationen zum Authoring .

Es lohnt sich, dass Jquery Bemerkens ist nur Javascript, so dass es nichts Besonderes an einem „jquery - Methode“ ist.

Jamiec
quelle
1
'Es gibt nichts Besonderes an einer "jquery-Methode"' - Ja, es gibt: Eine "jQuery-Methode" funktioniert für ein jQuery-Objekt. (Aber ja, jQuery ist nur JS ...)
nnnnnn
3

Erstellen Sie eine "Kolorierungs" -Methode:

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

Benutze es:

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

Dieses einfache Beispiel kombiniert das Beste aus dem Erstellen eines Basis-Plugins in den jQuery-Dokumenten und die Antworten von @Candide , @Michael .

Bob Stein
quelle
3

Sie können dies immer tun:

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

quelle
2

Es hört sich so an, als ob Sie das jQuery-Objekt über seinen Prototyp erweitern möchten (auch bekannt als Schreiben eines jQuery-Plugins ). Dies würde bedeuten, dass jedes neue Objekt, das durch Aufrufen der jQuery-Funktion ( $(selector/DOM element)) erstellt wurde, über diese Methode verfügt.

Hier ist ein sehr einfaches Beispiel:

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

Demo

jbabey
quelle
1

Das einfachste Beispiel für die Erstellung einer Funktion in jQuery ist

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

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