Я пытаюсь написать плагин jQuery, который предоставит дополнительные функции / методы объекту, который его вызывает. Все учебные пособия, которые я читаю в Интернете (просматриваю последние 2 часа), включают, самое большее, как добавлять параметры, но не дополнительные функции.
Вот что я хочу сделать:
// форматируем div как контейнер сообщений, вызывая плагин для этого div
$("#mydiv").messagePlugin();
$("#mydiv").messagePlugin().saySomething("hello");
Или что-то вдоль этих линий. Вот к чему это сводится: я вызываю плагин, а затем вызываю функцию, связанную с этим плагином. Кажется, я не могу найти способ сделать это, и я видел, как многие плагины делали это раньше.
Вот что у меня есть для плагина:
jQuery.fn.messagePlugin = function() {
return this.each(function(){
alert(this);
});
//i tried to do this, but it does not seem to work
jQuery.fn.messagePlugin.saySomething = function(message){
$(this).html(message);
}
};
Как я могу добиться этого?
Спасибо!
Обновление 18 ноября 2013 г .: я изменил правильный ответ на следующие комментарии и голоса Хари.
источник
this.data('tooltip', $.extend(true, {}, $.fn.tooltip.defaults, methodOrOptions));
так что теперь я могу получить доступ к параметрам, когда захочу, после инициализации.init
.Вот шаблон, который я использовал для создания плагинов с дополнительными методами. Вы бы использовали это так:
$('selector').myplugin( { key: 'value' } );
или, чтобы вызвать метод напрямую,
$('selector').myplugin( 'mymethod1', 'argument' );
Пример:
;(function($) { $.fn.extend({ myplugin: function(options,arg) { if (options && typeof(options) == 'object') { options = $.extend( {}, $.myplugin.defaults, options ); } // this creates a plugin for each element in // the selector or runs the function once per // selector. To have it do so for just the // first element (once), return false after // creating the plugin to stop the each iteration this.each(function() { new $.myplugin(this, options, arg ); }); return; } }); $.myplugin = function( elem, options, arg ) { if (options && typeof(options) == 'string') { if (options == 'mymethod1') { myplugin_method1( arg ); } else if (options == 'mymethod2') { myplugin_method2( arg ); } return; } ...normal plugin actions... function myplugin_method1(arg) { ...do method1 with this and arg } function myplugin_method2(arg) { ...do method2 with this and arg } }; $.myplugin.defaults = { ... }; })(jQuery);
источник
;
ваша первая строка? пожалуйста, объясните мне :)А как насчет этого подхода:
jQuery.fn.messagePlugin = function(){ var selectedObjects = this; return { saySomething : function(message){ $(selectedObjects).each(function(){ $(this).html(message); }); return selectedObjects; // Preserve the jQuery chainability }, anotherAction : function(){ //... return selectedObjects; } }; } // Usage: $('p').messagePlugin().saySomething('I am a Paragraph').css('color', 'red');
Выбранные объекты сохраняются в закрытии messagePlugin, и эта функция возвращает объект, содержащий функции, связанные с плагином, в каждой функции вы можете выполнять желаемые действия с текущими выбранными объектами.
Вы можете протестировать и играть с кодом здесь .
Изменить: обновленный код для сохранения возможностей цепочки jQuery.
источник
$('p').messagePlugin()
если вы не вызовете одну из двух функций, которые он возвращает.Проблема с текущим выбранным ответом заключается в том, что вы на самом деле не создаете новый экземпляр настраиваемого плагина для каждого элемента в селекторе, как вы думаете, что делаете ... на самом деле вы создаете только один экземпляр и передаете сам селектор как область видимости.
Просмотрите эту скрипку для более глубокого объяснения.
Вместо этого вам нужно перебрать селектор с помощью jQuery.each и создать новый экземпляр настраиваемого плагина для каждого элемента в селекторе.
Вот как:
(function($) { var CustomPlugin = function($el, options) { this._defaults = { randomizer: Math.random() }; this._options = $.extend(true, {}, this._defaults, options); this.options = function(options) { return (options) ? $.extend(true, this._options, options) : this._options; }; this.move = function() { $el.css('margin-left', this._options.randomizer * 100); }; }; $.fn.customPlugin = function(methodOrOptions) { var method = (typeof methodOrOptions === 'string') ? methodOrOptions : undefined; if (method) { var customPlugins = []; function getCustomPlugin() { var $el = $(this); var customPlugin = $el.data('customPlugin'); customPlugins.push(customPlugin); } this.each(getCustomPlugin); var args = (arguments.length > 1) ? Array.prototype.slice.call(arguments, 1) : undefined; var results = []; function applyMethod(index) { var customPlugin = customPlugins[index]; if (!customPlugin) { console.warn('$.customPlugin not instantiated yet'); console.info(this); results.push(undefined); return; } if (typeof customPlugin[method] === 'function') { var result = customPlugin[method].apply(customPlugin, args); results.push(result); } else { console.warn('Method \'' + method + '\' not defined in $.customPlugin'); } } this.each(applyMethod); return (results.length > 1) ? results : results[0]; } else { var options = (typeof methodOrOptions === 'object') ? methodOrOptions : undefined; function init() { var $el = $(this); var customPlugin = new CustomPlugin($el, options); $el.data('customPlugin', customPlugin); } return this.each(init); } }; })(jQuery);
И рабочая скрипка .
Вы заметите, как в первой скрипке все div всегда перемещаются вправо на одинаковое количество пикселей. Это потому, что для всех элементов в селекторе существует только один объект параметров.
Используя описанную выше технику, вы заметите, что во второй скрипке каждый div не выровнен и перемещается случайным образом (за исключением первого div, поскольку его рандомизатор всегда установлен на 1 в строке 89). Это потому, что теперь мы правильно создаем новый экземпляр настраиваемого плагина для каждого элемента в селекторе. Каждый элемент имеет свой собственный объект параметров и сохраняется не в селекторе, а в экземпляре самого настраиваемого плагина.
Это означает, что вы сможете получить доступ к методам настраиваемого плагина, созданного для определенного элемента в DOM, из новых селекторов jQuery и не будете вынуждены кэшировать их, как если бы вы были в первой скрипке.
Например, это вернет массив всех объектов параметров, используя метод второй скрипки. Он вернет undefined в первом.
$('div').customPlugin(); $('div').customPlugin('options'); // would return an array of all options objects
Вот как вам нужно будет получить доступ к объекту параметров в первой скрипке и вернуть только один объект, а не их массив:
var divs = $('div').customPlugin(); divs.customPlugin('options'); // would return a single options object $('div').customPlugin('options'); // would return undefined, since it's not a cached selector
Я бы предложил использовать описанную выше технику, а не тот, который был выбран в данный момент.
источник
$('.my-elements').find('.first-input').customPlugin('update', 'first value').end().find('.second-input').customPlugin('update', 'second value'); returns Cannot read property 'end' of undefined
. jsfiddle.net/h8v1k2pLjQuery значительно упростил это с введением фабрики виджетов .
Пример:
$.widget( "myNamespace.myPlugin", { options: { // Default options }, _create: function() { // Initialization logic here }, // Create a public method. myPublicMethod: function( argument ) { // ... }, // Create a private method. _myPrivateMethod: function( argument ) { // ... } });
Инициализация:
$('#my-element').myPlugin(); $('#my-element').myPlugin( {defaultValue:10} );
Вызов метода:
$('#my-element').myPlugin('myPublicMethod', 20);
(Так создается библиотека jQuery UI .)
источник
Более простой подход - использовать вложенные функции. Затем вы можете связать их объектно-ориентированным способом. Пример:
jQuery.fn.MyPlugin = function() { var _this = this; var a = 1; jQuery.fn.MyPlugin.DoSomething = function() { var b = a; var c = 2; jQuery.fn.MyPlugin.DoSomething.DoEvenMore = function() { var d = a; var e = c; var f = 3; return _this; }; return _this; }; return this; };
А вот как это назвать:
var pluginContainer = $("#divSomeContainer"); pluginContainer.MyPlugin(); pluginContainer.MyPlugin.DoSomething(); pluginContainer.MyPlugin.DoSomething.DoEvenMore();
Но будьте осторожны. Вы не можете вызвать вложенную функцию, пока она не будет создана. Итак, вы не можете этого сделать:
var pluginContainer = $("#divSomeContainer"); pluginContainer.MyPlugin(); pluginContainer.MyPlugin.DoSomething.DoEvenMore(); pluginContainer.MyPlugin.DoSomething();
Функция DoEvenMore даже не существует, потому что еще не запущена функция DoSomething, которая требуется для создания функции DoEvenMore. Для большинства плагинов jQuery у вас действительно будет только один уровень вложенных функций, а не два, как я показал здесь.
Просто убедитесь, что при создании вложенных функций вы определяете эти функции в начале их родительской функции до того, как будет выполнен любой другой код в родительской функции.
Наконец, обратите внимание, что член «this» хранится в переменной с именем «_this». Для вложенных функций вы должны вернуть «_this», если вам нужна ссылка на экземпляр в вызывающем клиенте. Вы не можете просто вернуть «this» во вложенной функции, потому что это вернет ссылку на функцию, а не на экземпляр jQuery. Возврат ссылки jQuery позволяет связать внутренние методы jQuery при возврате.
источник
Я получил его из jQuery Plugin Boilerplate
Также описано в jQuery Plugin Boilerplate, reprise
// jQuery Plugin Boilerplate // A boilerplate for jumpstarting jQuery plugins development // version 1.1, May 14th, 2011 // by Stefan Gabos // remember to change every instance of "pluginName" to the name of your plugin! (function($) { // here we go! $.pluginName = function(element, options) { // plugin's default options // this is private property and is accessible only from inside the plugin var defaults = { foo: 'bar', // if your plugin is event-driven, you may provide callback capabilities // for its events. execute these functions before or after events of your // plugin, so that users may customize those particular events without // changing the plugin's code onFoo: function() {} } // to avoid confusions, use "plugin" to reference the // current instance of the object var plugin = this; // this will hold the merged default, and user-provided options // plugin's properties will be available through this object like: // plugin.settings.propertyName from inside the plugin or // element.data('pluginName').settings.propertyName from outside the plugin, // where "element" is the element the plugin is attached to; plugin.settings = {} var $element = $(element), // reference to the jQuery version of DOM element element = element; // reference to the actual DOM element // the "constructor" method that gets called when the object is created plugin.init = function() { // the plugin's final properties are the merged default and // user-provided options (if any) plugin.settings = $.extend({}, defaults, options); // code goes here } // public methods // these methods can be called like: // plugin.methodName(arg1, arg2, ... argn) from inside the plugin or // element.data('pluginName').publicMethod(arg1, arg2, ... argn) from outside // the plugin, where "element" is the element the plugin is attached to; // a public method. for demonstration purposes only - remove it! plugin.foo_public_method = function() { // code goes here } // private methods // these methods can be called only from inside the plugin like: // methodName(arg1, arg2, ... argn) // a private method. for demonstration purposes only - remove it! var foo_private_method = function() { // code goes here } // fire up the plugin! // call the "constructor" method plugin.init(); } // add the plugin to the jQuery.fn object $.fn.pluginName = function(options) { // iterate through the DOM elements we are attaching the plugin to return this.each(function() { // if plugin has not already been attached to the element if (undefined == $(this).data('pluginName')) { // create a new instance of the plugin // pass the DOM element and the user-provided options as arguments var plugin = new $.pluginName(this, options); // in the jQuery version of the element // store a reference to the plugin object // you can later access the plugin and its methods and properties like // element.data('pluginName').publicMethod(arg1, arg2, ... argn) or // element.data('pluginName').settings.propertyName $(this).data('pluginName', plugin); } }); } })(jQuery);
источник
$('.first-input').data('pluginName').publicMethod('new value').css('color', red);
возвращаетCannot read property 'css' of undefined
jsfiddle.net/h8v1k2pL/1return $element
так, чтобы в этом примере вы изменили его наplugin.foo_public_method = function() {/* Your Code */ return $element;}
@Salim, спасибо за помощь ... github.com/AndreaLombardo/BootSideMenu/pull/34Слишком поздно, но, возможно, однажды это поможет кому-то.
У меня была такая же ситуация, как при создании плагина jQuery с некоторыми методами, и после прочтения некоторых статей и некоторых шин я создал шаблон плагина jQuery ( https://github.com/acanimal/jQuery-Plugin-Boilerplate ).
Кроме того, я разрабатываю с его помощью плагин для управления тегами ( https://github.com/acanimal/tagger.js ) и написал два сообщения в блоге, в которых пошагово объясняется создание плагина jQuery ( http: // acuriousanimal. com / blog / 2013/01/15 / things-i-learn-Creating-a-jquery-plugin-part-i / ).
источник
Ты можешь сделать:
(function($) { var YourPlugin = function(element, option) { var defaults = { //default value } this.option = $.extend({}, defaults, option); this.$element = $(element); this.init(); } YourPlugin.prototype = { init: function() { }, show: function() { }, //another functions } $.fn.yourPlugin = function(option) { var arg = arguments, options = typeof option == 'object' && option;; return this.each(function() { var $this = $(this), data = $this.data('yourPlugin'); if (!data) $this.data('yourPlugin', (data = new YourPlugin(this, options))); if (typeof option === 'string') { if (arg.length > 1) { data[option].apply(data, Array.prototype.slice.call(arg, 1)); } else { data[option](); } } }); }; });
Таким образом, ваш объект плагинов сохраняется как значение данных в вашем элементе.
//Initialization without option $('#myId').yourPlugin(); //Initialization with option $('#myId').yourPlugin({ // your option }); // call show method $('#myId').yourPlugin('show');
источник
А как насчет использования триггеров? Кто-нибудь знает недостаток их использования? Преимущество в том, что все внутренние переменные доступны через триггеры, а код очень прост.
Смотрите на jsfiddle .
Пример использования
<div id="mydiv">This is the message container...</div> <script> var mp = $("#mydiv").messagePlugin(); // the plugin returns the element it is called on mp.trigger("messagePlugin.saySomething", "hello"); // so defining the mp variable is not needed... $("#mydiv").trigger("messagePlugin.repeatLastMessage"); </script>
Плагин
jQuery.fn.messagePlugin = function() { return this.each(function() { var lastmessage, $this = $(this); $this.on('messagePlugin.saySomething', function(e, message) { lastmessage = message; saySomething(message); }); $this.on('messagePlugin.repeatLastMessage', function(e) { repeatLastMessage(); }); function saySomething(message) { $this.html("<p>" + message + "</p>"); } function repeatLastMessage() { $this.append('<p>Last message was: ' + lastmessage + '</p>'); } }); }
источник
Здесь я хочу предложить шаги по созданию простого плагина с аргументами.
(function($) { $.fn.myFirstPlugin = function(options) { // Default params var params = $.extend({ text : 'Default Title', fontsize : 10, }, options); return $(this).text(params.text); } }(jQuery)); $('.cls-title').myFirstPlugin({ text : 'Argument Title' });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <h1 class="cls-title"></h1>
Здесь мы добавили вызываемый объект по умолчанию
params
и установили значения параметров по умолчанию с помощьюextend
функции. Следовательно, если мы передадим пустой аргумент, тогда он установит значения по умолчанию, в противном случае он будет установлен.Подробнее: Как создать плагин JQuery
источник
Попробуй это:
$.fn.extend({ "calendar":function(){ console.log(this); var methods = { "add":function(){console.log("add"); return this;}, "init":function(){console.log("init"); return this;}, "sample":function(){console.log("sample"); return this;} }; methods.init(); // you can call any method inside return methods; }}); $.fn.calendar() // caller or $.fn.calendar().sample().add().sample() ......; // call methods
источник
Вот моя голая версия этого. Подобно тем, которые были опубликованы ранее, вы должны позвонить так:
$('#myDiv').MessagePlugin({ yourSettings: 'here' }) .MessagePlugin('saySomething','Hello World!');
-или получить доступ к экземпляру напрямую @
plugin_MessagePlugin
$elem = $('#myDiv').MessagePlugin(); var instance = $elem.data('plugin_MessagePlugin'); instance.saySomething('Hello World!');
MessagePlugin.js
;(function($){ function MessagePlugin(element,settings){ // The Plugin this.$elem = element; this._settings = settings; this.settings = $.extend(this._default,settings); } MessagePlugin.prototype = { // The Plugin prototype _default: { message: 'Generic message' }, initialize: function(){}, saySomething: function(message){ message = message || this._default.message; return this.$elem.html(message); } }; $.fn.MessagePlugin = function(settings){ // The Plugin call var instance = this.data('plugin_MessagePlugin'); // Get instance if(instance===undefined){ // Do instantiate if undefined settings = settings || {}; this.data('plugin_MessagePlugin',new MessagePlugin(this,settings)); return this; } if($.isFunction(MessagePlugin.prototype[settings])){ // Call method if argument is name of method var args = Array.prototype.slice.call(arguments); // Get the arguments as Array args.shift(); // Remove first argument (name of method) return MessagePlugin.prototype[settings].apply(instance, args); // Call the method } // Do error handling return this; } })(jQuery);
источник
Следующая структура подключаемого модуля использует метод jQuery
data()
для предоставления открытого интерфейса внутренним методам / настройкам подключаемых модулей (при сохранении цепочки jQuery):(function($, window, undefined) { const defaults = { elementId : null, shape : "square", color : "aqua", borderWidth : "10px", borderColor : "DarkGray" }; $.fn.myPlugin = function(options) { // settings, e.g.: var settings = $.extend({}, defaults, options); // private methods, e.g.: var setBorder = function(color, width) { settings.borderColor = color; settings.borderWidth = width; drawShape(); }; var drawShape = function() { $('#' + settings.elementId).attr('class', settings.shape + " " + "center"); $('#' + settings.elementId).css({ 'background-color': settings.color, 'border': settings.borderWidth + ' solid ' + settings.borderColor }); $('#' + settings.elementId).html(settings.color + " " + settings.shape); }; return this.each(function() { // jQuery chainability // set stuff on ini, e.g.: settings.elementId = $(this).attr('id'); drawShape(); // PUBLIC INTERFACE // gives us stuff like: // // $("#...").data('myPlugin').myPublicPluginMethod(); // var myPlugin = { element: $(this), // access private plugin methods, e.g.: setBorder: function(color, width) { setBorder(color, width); return this.element; // To ensure jQuery chainability }, // access plugin settings, e.g.: color: function() { return settings.color; }, // access setting "shape" shape: function() { return settings.shape; }, // inspect settings inspectSettings: function() { msg = "inspecting settings for element '" + settings.elementId + "':"; msg += "\n--- shape: '" + settings.shape + "'"; msg += "\n--- color: '" + settings.color + "'"; msg += "\n--- border: '" + settings.borderWidth + ' solid ' + settings.borderColor + "'"; return msg; }, // do stuff on element, e.g.: change: function(shape, color) { settings.shape = shape; settings.color = color; drawShape(); return this.element; // To ensure jQuery chainability } }; $(this).data("myPlugin", myPlugin); }); // return this.each }; // myPlugin }(jQuery));
Теперь вы можете вызывать внутренние методы плагина для доступа или изменения данных плагина или соответствующего элемента, используя этот синтаксис:
$("#...").data('myPlugin').myPublicPluginMethod();
Пока вы возвращаете текущий элемент (this) изнутри вашей реализации
myPublicPluginMethod()
jQuery-chainability, будет сохраняться, поэтому работает следующее:$("#...").data('myPlugin').myPublicPluginMethod().css("color", "red").html("....");
Вот несколько примеров (подробности см. В этой скрипке ):
// initialize plugin on elements, e.g.: $("#shape1").myPlugin({shape: 'square', color: 'blue', borderColor: 'SteelBlue'}); $("#shape2").myPlugin({shape: 'rectangle', color: 'red', borderColor: '#ff4d4d'}); $("#shape3").myPlugin({shape: 'circle', color: 'green', borderColor: 'LimeGreen'}); // calling plugin methods to read element specific plugin settings: console.log($("#shape1").data('myPlugin').inspectSettings()); console.log($("#shape2").data('myPlugin').inspectSettings()); console.log($("#shape3").data('myPlugin').inspectSettings()); // calling plugin methods to modify elements, e.g.: // (OMG! And they are chainable too!) $("#shape1").data('myPlugin').change("circle", "green").fadeOut(2000).fadeIn(2000); $("#shape1").data('myPlugin').setBorder('LimeGreen', '30px'); $("#shape2").data('myPlugin').change("rectangle", "red"); $("#shape2").data('myPlugin').setBorder('#ff4d4d', '40px').css({ 'width': '350px', 'font-size': '2em' }).slideUp(2000).slideDown(2000); $("#shape3").data('myPlugin').change("square", "blue").fadeOut(2000).fadeIn(2000); $("#shape3").data('myPlugin').setBorder('SteelBlue', '30px'); // etc. ...
источник
На самом деле это можно заставить работать "приятным" способом, используя
defineProperty
. Где "хороший" означает отсутствие необходимости использовать()
для получения пространства имен плагина или передавать имя функции по строке.Ничто из совместимости:
defineProperty
не работает в старых браузерах, таких как IE8 и ниже. Предостережение:$.fn.color.blue.apply(foo, args)
не получится, нужно использоватьfoo.color.blue.apply(foo, args)
.function $_color(color) { return this.css('color', color); } function $_color_blue() { return this.css('color', 'blue'); } Object.defineProperty($.fn, 'color', { enumerable: true, get: function() { var self = this; var ret = function() { return $_color.apply(self, arguments); } ret.blue = function() { return $_color_blue.apply(self, arguments); } return ret; } }); $('#foo').color('#f00'); $('#bar').color.blue();
Ссылка JSFiddle
источник
Согласно стандарту jquery вы можете создать плагин следующим образом:
(function($) { //methods starts here.... var methods = { init : function(method,options) { this.loadKeywords.settings = $.extend({}, this.loadKeywords.defaults, options); methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); $loadkeywordbase=$(this); }, show : function() { //your code here................. }, getData : function() { //your code here................. } } // do not put semi colon here otherwise it will not work in ie7 //end of methods //main plugin function starts here... $.fn.loadKeywords = function(options,method) { if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call( arguments, 1)); } else if (typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } else { $.error('Method ' + method + ' does not ecw-Keywords'); } }; $.fn.loadKeywords.defaults = { keyName: 'Messages', Options: '1', callback: '', }; $.fn.loadKeywords.settings = {}; //end of plugin keyword function. })(jQuery);
Как вызвать этот плагин?
1.$('your element').loadKeywords('show',{'callback':callbackdata,'keyName':'myKey'}); // show() will be called
Ссылка: ссылка
источник
Думаю, это может тебе помочь ...
(function ( $ ) { $.fn.highlight = function( options ) { // This is the easiest way to have default options. var settings = $.extend({ // These are the defaults. color: "#000", backgroundColor: "yellow" }, options ); // Highlight the collection based on the settings variable. return this.css({ color: settings.color, backgroundColor: settings.backgroundColor }); }; }( jQuery ));
В приведенном выше примере я создал простой плагин выделения jquery. Я поделился статьей, в которой обсуждал, как создать свой собственный плагин jQuery от базового до расширенного. Думаю, тебе стоит это проверить ... http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/
источник
Ниже приведен небольшой плагин, содержащий метод предупреждения для отладки. Сохраните этот код в файле jquery.debug.js: JS:
jQuery.fn.warning = function() { return this.each(function() { alert('Tag Name:"' + $(this).prop("tagName") + '".'); }); };
HTML:
<html> <head> <title>The jQuery Example</title> <script type = "text/javascript" src = "http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <script src = "jquery.debug.js" type = "text/javascript"></script> <script type = "text/javascript" language = "javascript"> $(document).ready(function() { $("div").warning(); $("p").warning(); }); </script> </head> <body> <p>This is paragraph</p> <div>This is division</div> </body> </html>
источник
Вот как я это делаю:
(function ( $ ) { $.fn.gridview = function( options ) { .......... .......... var factory = new htmlFactory(); factory.header(...); ........ }; }( jQuery )); var htmlFactory = function(){ //header this.header = function(object){ console.log(object); } }
источник
То, что вы сделали, в основном расширило объект jQuery.fn.messagePlugin новым методом. Что полезно, но не в вашем случае.
Вы должны использовать эту технику
function methodA(args){ this // refers to object... } function saySomething(message){ this.html(message); to first function } jQuery.fn.messagePlugin = function(opts) { if(opts=='methodA') methodA.call(this); if(opts=='saySomething') saySomething.call(this, arguments[0]); // arguments is an array of passed parameters return this.each(function(){ alert(this); }); };
Но вы можете сделать то, что хотите. Я имею в виду, что есть способ сделать $ ("# mydiv"). MessagePlugin (). SaySomething ("hello"); Мой друг, он начал писать о лугинах и о том, как расширить их с помощью своей функциональности, вот ссылка на его блог.
источник