Jak utworzyć funkcję jQuery (nowa metoda jQuery lub wtyczka)?

203

Wiem, że w JavaScript składnia jest następująca:

function myfunction(param){
  //some code
}

Czy istnieje sposób zadeklarowania funkcji w jQuery, którą można dodać do elementu? Na przykład:

$('#my_div').myfunction()
multimediaxp
źródło
6
@RedEyedMonster - to sprawia, że wiele sensu. Czy kiedykolwiek używałeś czegoś takiego jak jQuery datepicker? $('#myDatePickerfield').datePicker();
Jamiec
Nie, nie, ale dziękuję za powiadomienie mnie o tym :)
RedEyedMonster
3
@RedEyedMonster - Prawdopodobnie użyłeś $("#someElement").hide()lub .addClass()...
nnnnnn
@RedEyedMonster: OP opisuje wtyczki jQuery, które w rzeczywistości są dość powszechne w JavaScript. Zobacz docs.jquery.com/Plugins/Authoring
Paul D. Waite

Odpowiedzi:

286

Z Dokumentów :

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

To robisz

$('#my_div').myfunction();
Candide
źródło
61
Aby dodać coś, co uważałem za ważne: proszę dodać - zwróć to; po ostrzeżeniu. Sprawi, że funkcja będzie mogła być łańcuchowa.
Potheek
2
Wiele poprawnych odpowiedzi tutaj. JQuery-Docu pokazuje różnice: learn.jquery.com/plugins/basic-plugin-creation
Andy Tschiersch
@candide, w którym miejscu $('my_div').myfunction(); zadzwonić
Nikhil G
2
@NikhilG $ („my_div”) odnosi się do tagu <my_div></my_div>. Potrzebny jest tam znak skrótu, aby odnosić się do identyfikatora my_div.
Candide,
6
To dziwny przykład, ponieważ tak naprawdę nie dotyczy to tego elementu.
szeryfie
78

Pomimo wszystkich odpowiedzi, które już otrzymałeś, warto zauważyć, że nie trzeba pisać wtyczki, aby używać jQuery w funkcji. Z pewnością jeśli jest to prosta, jednorazowa funkcja, uważam, że napisanie wtyczki to przesada. Można to zrobić o wiele łatwiej, po prostu przekazując selektor do funkcji jako parametr . Twój kod wyglądałby mniej więcej tak:

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

myFunction($('#my_div'));

Zauważ, że $nazwa zmiennej $paramnie jest wymagana. To mój zwyczaj, aby ułatwić sobie zapamiętanie, że ta zmienna zawiera selektor jQuery. Możesz również użyć param.

Pevara
źródło
41

Chociaż istnieje mnóstwo dokumentacji / samouczków, prosta odpowiedź na twoje pytanie brzmi:

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

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

Wewnątrz tej funkcji thiszmienna odpowiada opakowanemu zestawowi jQuery, na którym wywołałeś swoją funkcję. Więc coś takiego:

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

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

... spłukuje do konsoli liczbę elementów z klasą foo.

Oczywiście w semantyce jest coś więcej (jak również najlepsze praktyki i cały ten jazz), więc przeczytajcie o tym.

Richard Neil Ilagan
źródło
14

Aby udostępnić funkcję na obiektach jQuery, dodajesz ją do prototypu jQuery (fn to skrót do prototypu w jQuery) w następujący sposób:

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

Zwykle nazywa się to wtyczką jQuery .

Przykład - http://jsfiddle.net/VwPrm/

Richard Dalton
źródło
8

Tak - opisujesz wtyczkę jQuery.

Aby napisać wtyczkę jQuery, należy utworzyć funkcję w JavaScript i przypisać ją do właściwości obiektu jQuery.fn.

Na przykład

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

W ramach funkcji wtyczki, this słowo kluczowe jest ustawione na obiekt jQuery, na którym wtyczka została wywołana. Więc kiedy to zrobisz:

$('#my_div').myfunction()

Następnie this wewnątrz myfunctionzostanie ustawiony obiekt jQuery zwracany przez $('#my_div').

Zobacz http://docs.jquery.com/Plugins/Authoring do pełnej historii.

Paul D. Waite
źródło
8
$(function () {
    //declare function 
    $.fn.myfunction = function () {
        return true;
    };
});

$(document).ready(function () {
    //call function
    $("#my_div").myfunction();
});
użytkownik1619962
źródło
Nie sądzę, że niedopasowanie w zamykaniu paren i nawiasów klamrowych to jedyne problemy z tym kodem. Proszę napraw.
Christoffer Lette
6

Możesz także użyć rozszerzenia (sposobu tworzenia wtyczek jQuery):

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

    myfunction2: function () 
    {
    }
});

Stosowanie:

$('#my_div').myfunction();
Novasol
źródło
5

Możesz napisać własne wtyczki jQuery (funkcja, którą można wywołać na wybranych elementach), jak poniżej:

(funkcja ($) {
    $ .fn.myFunc = funkcja (param1, param2) {
        // this - obiekt jquery przechowuje wybrane elementy
    }
}) (jQuery);


Nazwij to później:

$ („div”). myFunc (1, null);
Michael
źródło
4

Tak, metody stosowane do elementów wybranych za pomocą jquery, nazywane są wtyczkami jquery, a dokumentacja jquery zawiera sporo informacji na temat tworzenia .

Warto zauważyć, że jquery jest po prostu javascript, więc nie ma nic specjalnego w „metodzie jquery”.

Jamiec
źródło
1
„nie ma nic specjalnego w„ metodzie jquery ”” - Tak, istnieje: „metoda jQuery” działa na obiekcie jQuery. (Ale tak, jQuery to po prostu JS ...)
nnnnnn
3

Utwórz metodę „kolorowania”:

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

Użyj tego:

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

Ten prosty przykład łączy w sobie najlepsze sposoby tworzenia podstawowej wtyczki w dokumentach jQuery oraz odpowiedzi od @Candide , @Michael .

Bob Stein
źródło
3

Zawsze możesz to zrobić:

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

źródło
2

Wygląda na to, że chcesz rozszerzyć obiekt jQuery za pomocą jego prototypu (inaczej napisać wtyczkę jQuery ). Oznaczałoby to, że każdy nowy obiekt utworzony przez wywołanie funkcji jQuery ( $(selector/DOM element)) miałby tę metodę.

Oto bardzo prosty przykład:

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

Próbny

jbabey
źródło
1

Najprostszym przykładem wykonania dowolnej funkcji w jQuery jest

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

if($(selector).exists()){/*do something here*/}
Chintan Thummar
źródło