Можно ли написать вторую в плагине 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

Некоторые примеры кода здесь:

http://groups.google.com/group/jquery-dev/browse_thread/thread/664cb89b43ccb92c/34f74665423f73c9?lnk=gst&q=structure+plugin+authoring

Это примерно на полпути вниз по странице.

Я надеюсь, что вы найдете это полезным!

Другие вопросы по тегам