Можно ли написать вторую в плагине JQuery нестатическую функцию выбора?
Почти все примеры в уроках jQuery, которые я читал, обычно используют одну основную публичную функцию для выбора плагинов. Когда я говорю "выбор" плагина, я имею в виду тот, который не является просто статической функцией, расширенной на jQuery.
Например:
(function($) {
jQuery.fn.actionList = function(options) {
var opts = $.extend({}, $.fn.actionList.defaults, options);
return this.each(function(){
alert(this);
});
};
$.fn.actionList.defaults = {
listHtml: '<div>Set the list html</div>'
};
})(jQuery);
но нет:
jQuery.log = function(message) {
if(window.console) {
console.debug(message);
} else {
alert(message);
}
};
Это прекрасно работает для большинства вещей, но я хотел бы иметь возможность вызывать вторую функцию для объекта, возвращаемого после первого вызова.
var actionBox = $('actionBox').actionList(options);
//Many light-cycles later
actionBox.refreshData(data);
или, может быть, даже:
$('actionBox').actionList(options);
// laaateerr
$('actionBox').actionList.refreshData(data);
Я предполагаю, что одно или оба из них невозможно или, по крайней мере, не рекомендуется, но я только сейчас вникну в самые глубокие аспекты jQuery и javascript.
Может ли кто-нибудь объяснить, как это сделать, или, если это невозможно или нежелательно, почему? и что они будут делать вместо этого?
Спасибо за прочтение!
2 ответа
Я не совсем уверен, к чему вы клоните, но вы можете вызвать вторую функцию для объекта, возвращенного из первой функции - на самом деле, очень рекомендуется возвращать объект jQuery из ваших плагинов, и причину, почему Вы можете объединять команды в JQuery.
Используя ваши примеры
var actionBox = $('actionBox').actionList(options);
//Many light-cycles later
actionBox.refreshData(data);
будет работать нормально, пока оба .actionList()
а также .refreshData(data)
обе команды возвращают объект jQuery.
А также
$('actionBox').actionList.refreshData(data);
должно быть
$('actionBox').actionList().refreshData(data);
РЕДАКТИРОВАТЬ:
Глядя на исходный код jQuery,
jQuery.fn = jQuery.prototype = {
/*
Load of 'property' functions of jQuery object...
*/
}
Итак, добавление свойств (так называемые плагины) jQuery.fn
расширяет прототип объекта jQuery. Когда вы звоните
$(selector, context);
новый объект jQuery возвращается, используя init
функциясвойства объекта jQuery
jQuery = window.jQuery = window.$ = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
},
Я думаю, что у меня есть плагин, который может быть очень полезным для вас. Он позволяет вам применять любой конструктор / объект к jQuery как к его собственному пространству имен, и вы можете использовать 'this', как обычно с jQuery, для ссылки на набор объектов. Использование этого [methodName] вызовет метод для вашего объекта и т. Д.
http://code.google.com/p/jquery-plugin-dev/source/browse/trunk/jquery.plugin.js
Некоторые примеры кода здесь:
Это примерно на полпути вниз по странице.
Я надеюсь, что вы найдете это полезным!