Як створити функцію jQuery (новий метод або плагін jQuery)?


203

Я знаю, що в JavaScript синтаксис такий:

function myfunction(param){
  //some code
}

Чи є спосіб оголосити функцію в jQuery, яку можна додати до елемента? Наприклад:

$('#my_div').myfunction()

6
@RedEyedMonster - це має багато сенсу. Ви коли-небудь використовували щось на зразок jQuery datepicker? $('#myDatePickerfield').datePicker();
— Jamiec

Ні, у мене немає, але дякую, що попередили мене про це :)
— RedEyedMonster

3
@RedEyedMonster - Ви, мабуть, використовували $("#someElement").hide()або .addClass()...
— nnnnnn

@RedEyedMonster: ОП описує плагіни jQuery, які насправді є досить поширеними в JavaScript. Дивіться docs.jquery.com/Plugins/Authoring
— Пол Д. Уайт

Відповіді:


286

З Документів :

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

Тоді ти

$('#my_div').myfunction();

61
Просто додати щось, що я вважав важливим: будь ласка, додайте - поверніть це; після оповіщення. Це зробить функціональним ланцюг.
— Potheek

2
Тут багато правильних відповідей. JQuery-Docu показує відмінності: learn.jquery.com/plugins/basic-plugin-creation
— Енді Цьерш

@candide, в який момент $('my_div').myfunction(); буде дзвонити
— Nikhil G

2
@NikhilG $ ('my_div') посилається на тег <my_div></my_div>. Вам потрібен хеш-знак, щоб посилатися на ідентифікатор my_div.
— Кандид

6
Це дивний приклад, тому що він насправді нічого не відповідає цьому елементу.
— шерифдерек

78

Незважаючи на всі відповіді, які ви вже отримали, варто зазначити, що вам не потрібно писати плагін, щоб використовувати jQuery у функції. Безумовно, якщо це проста, разова функція, я вважаю, що написання плагіна є надмірним. Це можна зробити набагато простіше, просто передавши селектор функції як параметр . Ваш код виглядатиме приблизно так:

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

myFunction($('#my_div'));

Зауважте, що $ім'я змінної $paramне потрібно. Це моя звичка полегшувати запам'ятовування того, що ця змінна містить селектор jQuery. Ви можете просто використовувати paramтакож.


41

Хоча там є безліч документації / навчальних посібників, на ваше запитання проста відповідь:

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

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

Всередині цієї функції thisзмінна відповідає набору jQuery, який ви викликали. Тож щось на кшталт:

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

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

... до консолі додасть кількість елементів із класом foo.

Звичайно, в семантиці є трохи більше, ніж у цьому (а також кращі практики та весь цей джаз), тому обов'язково читайте на ній.


14

Щоб зробити функцію доступною для об’єктів jQuery, ви додасте її до прототипу jQuery (fn - це ярлик для прототипу в 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
    }
}

Зазвичай це називається плагін jQuery .

Приклад - http://jsfiddle.net/VwPrm/


8

Так, ви описуєте плагін jQuery.

Щоб написати плагін jQuery, ви створите функцію в JavaScript і призначите її властивості на об'єкті jQuery.fn.

Напр

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

У межах вашої функції плагіну thisключове слово встановлюється об’єктом jQuery, на який був запущений ваш плагін. Отже, коли ви робите:

$('#my_div').myfunction()

Тоді thisвсередині myfunctionбуде встановлено об'єкт jQuery, повернутий $('#my_div').

Дивіться http://docs.jquery.com/Plugins/Authoring для повної історії.


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

$(document).ready(function () {
    //call function
    $("#my_div").myfunction();
});

Я не думаю, що невідповідність закриття паролів і брекетів - єдині проблеми з цим кодом. Виправте, будь ласка.
— Крістофер Летте

6

Ви також можете використовувати розширення (спосіб створення плагінів jQuery):

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

    myfunction2: function () 
    {
    }
});

Використання:

$('#my_div').myfunction();

5

Ви можете написати свої власні плагіни jQuery (функцію, яку можна викликати на вибраних елементах), як нижче:

(функція ($) {
    $ .fn.myFunc = функція (param1, param2) {
        // цей - об'єкт jquery містить вибрані вами елементи
    }
}) (jQuery);


Назвіть це пізніше:

$ ('div'). myFunc (1, null);

4

Так, методи, які ви застосовуєте до елементів, вибраних за допомогою jquery, називаються плагінами jquery, і в документах jquery є достатня кількість інформації про створення .

Варто зауважити, що jquery - це лише JavaScript, тому в "методі jquery" немає нічого особливого.


1
'немає нічого особливого у «методі jquery»' - Так, є: «jQuery метод» працює на об’єкт jQuery. (Але так, jQuery - це просто JS ...)
— nnnnnn

3

Створіть метод "розфарбовування":

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

Використай це:

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

Цей простий-приклад поєднує найкраще, як створити базовий плагін у документах jQuery, та відповіді від @Candide , @Michael .


3

Ви завжди можете це зробити:

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

2

Це здається, що ви хочете розширити об’єкт jQuery через його прототип (він же написав плагін jQuery ). Це означатиме, що кожен новий об'єкт, створений за допомогою виклику функції jQuery ( $(selector/DOM element)), матиме цей метод.

Ось дуже простий приклад:

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

Демо


1

Найпростіший приклад зробити будь-яку функцію в jQuery

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

if($(selector).exists()){/*do something here*/}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.