#jquery #plugins #jquery-plugins #modeling
#jquery #Плагины #jquery-плагины #моделирование
Вопрос:
Мне нужно создать документ, который предоставляет «модель» для написания плагинов jQuery для большого сайта.
Например: все плагины должны иметь:
$.fn.somePlugin = function() {
return this.each(function() {
// Here the plugins does its goal.
});
};
таким образом, они уважают модель fluent, а также могут вызываться с несколькими элементами одновременно. Некоторые другие вещи, которые, я думаю, все они должны иметь, это:
- Параметры получения и настройки (как в jQuery-ui)
- Методы (как в jQuery-ui)
- Какой-нибудь способ изменить параметры по умолчанию. Конечно, это должно быть сделано без изменения файла плагина (опять же, как jQuery-ui).
Каким бы это был ваш «Модельный плагин»? (достижение этого и некоторых других вещей, которые вы считаете необходимыми, наилучшим возможным способом).
Результат
Здесь вы можете увидеть мой шаблон плагина, основанный на всей информации, которую я прочитал.
Комментарии:
1. docs.jquery.com/Plugins/Authoring содержит несколько довольно хороших рекомендаций
2. Вы пишете свою собственную библиотеку или пытаетесь расширить базовую библиотеку jquery?
3. Я бы избегал плагинов jQuery как шаблона архитектуры. Это действительно плохой шаблон. Пожалуйста, используйте загрузчики модулей и модульный код вместо этого
4. @Incognito Я пытаюсь создать модель для создания плагинов, которая расширяет ядро jquery.
5. @Raynos Не могли бы вы быть более конкретным или привести мне какой-нибудь пример, пожалуйста?
Ответ №1:
В документах jquery есть раздел, посвященный разработке плагинов: http://docs.jquery.com/Plugins/Authoring
и вот «слайды» из выступления Бена Алманса по разработке плагинов на бостонской конференции jquery:
https://github.com/cowboy/talks/blob/master/jquery-plugin-authoring.js
и еще одна ссылка от Бена Алмана о написании плагинов.
Комментарии:
1. На основе всех этих ссылок я создал свой собственный шаблон. Когда я закончу тестирование, я опубликую ссылку.
Ответ №2:
Обычно я использую структуру, подобную этой
(function ($, plugin) {
"use strict";
$[plugin] = function (options/* params */) {
var settings;
settings = $.extend({}, $[plugin].defaultSettings, options);
//static funciton code here
};
$.fn[plugin] = function (options/* params */) {
this.each(function (index, element) {
var settings, $this;
settings = $.extend({}, $.fn[plugin].defaultSettings, options);
$this = $(this);
$this.data(plugin 'Settings', settings);
//chainable function code here
});
return this;
};
$[plugin].defaultSettings = {
'foo': 'bar'
};
$.fn[plugin].defaultSettings = {
'fizz': 'buzz'
};
$(function(){
//document.ready initialization code here
});
}(jQuery, 'foo'));
Обычно я не заморачиваюсь с plugin
параметром, но это может быть полезно для обобщения названия плагина
Для ярлыков событий я буду использовать:
$.each('foo bar baz'.split(' '), function(i, name) {
$.fn[name] = function(data,fn){
if (fn == null) {
fn = data;
data = null;
}
return arguments.length > 0 ?
this.bind(name, data, fn) :
this.trigger(name);
};
});
Которые будут создавать .foo()
, .bar()
.baz()
все в качестве ярлыков для привязки / запуска событий 'foo'
, 'bar'
'baz'
и,,,.
Комментарии:
1. Обратите внимание, что все эти разделы являются необязательными. Вполне допустимо не иметь никакого document.ready или статического кода
2. Это не дает всего, о чем я просил. т.е. Как бы вы получили или установили опцию после вызова плагина?
3. @Diego, нищим выбирать не приходится:-p то, как вы обрабатываете параметры, зависит от вас. Вам потребуется доскональное понимание сигнатур каждого метода, которые вы планируете поддерживать, и вам нужно будет выполнить проверку типов, чтобы убедиться, что были предоставлены правильные параметры.
4. @Diego, я настоятельно рекомендую ознакомиться с фабрикой виджетов jQuery-UI . Если вы создаете виджет большего размера, это может значительно упростить код.
Ответ №3:
Я уже ДАВНО использую следующий шаблон, и, похоже, он делает все необходимое, а также обеспечивает традиционные сценарии jQuery, такие как: $.myPlugin("element", {options})
, $.myPlugin({options}, callback)
или ‘$(«элемент»).myPlugin();
(function($) {
if (!$.myExample) { // check your plugin namespace does not already exist
$.extend({ // this will allow you to add your plugin to the jQuery lib
myExample: function(elm, command, args) {
// keep in mind, right here you might want to do a class or data check to determine which direction this call is going
// for example, upon init the plugin on an element you may add the plugin name as a class,
// this way, when it's recalled, you can see it alrady has that class and might be calling a command,
// thus make an if statemnt to push the process through
return elm.each(function(index){
// do work to each element as its passed through
// be sure to use something like
// return elm.each(function(e) { dor work });
// as your final statement in order to maintain "chainability"
});
}
});
$.fn.extend({ // this gives the chainability functionality seen with $ funcs like: $("#eleID").css("color", "red") <--returns original element object
myExample: function(command) {
return $.myExample($(this), command, Array.prototype.slice.call(arguments, 1));
}
});
$.myExample.props = { // Here you can establish specific properties to your plugin, prehaps even make them "Over-writable"
key1: "value",
key2: "value"
};
$.myExample.methods = { // Here you can establish specific methods/functions for your plguin to carry out and maintain your namespace as well
key1: function(param) {
/* do work */
},
key2: function(param) {
/* do work */
}
};
// This next part is not seen in many plugins but useful depending on what you're creating
$.myExample.init = function(param) { // If you have an initialize method to apply, namespace it in here and calll on initializing your plugin
var key = "value",
key2 = {
subKey: "value"
};
/*
/ run any number of initializing functions here
/ I prefer to make my param a value that can be a
/ string with a possible object
/ the string for holding a base configuration
/ the object for any change in properties or base values for that config
*/
};
$.myExample.defaults = { // establish base properties here that can be over-written via .props, but their values should never truly change
key1: "value",
key2: {
prop1: {
subKey1: "value",
subKey2: "value"
},
prop2: {
subKey1: "value"
}
},
key3: function(param) {
}
};
}
})(jQuery);