Переопределить функцию плагина jQuery, как в пользовательском интерфейсе jQuery - PullRequest
1 голос
/ 28 ноября 2011

Я знаю, что этот вопрос несколько раз обошелся, но ответы, похоже, не совсем то, что я ищу.Скажем, у меня есть плагин под названием «jdropdown», который выглядит следующим образом:

(function($){
    var options = {},
    methods = {},
    renderItem = function(){},

    $.fn.jdropdown = function(method){
        // plugin method despatcher
    });
 })(jQuery);

Теперь, когда я объявляю плагин, я хочу позволить пользователю переопределить функцию renderItem в плагине.Я заметил, что jQuery UI справляется с этим, разрешая доступ к элементу через атрибут данных (как может показаться в этом примере: http://jqueryui.com/demos/autocomplete/#custom-data), но всякий раз, когда я пытаюсь сделать что-то подобное, я захожу в тупик. Iпрочитал раздел «Данные»: http://docs.jquery.com/Plugins/Authoring безрезультатно (Они не описывают, как вещи работают так хорошо, они просто пишут «FTW» и указывают, почему они полезны).

Есть ли кто-нибудь, кто может показать мне, как использовать атрибут данных моего элемента (привязка плагина) для доступа к методам плагинов, чтобы переопределить их следующим образом:

$('.someThing').jdropdown().data('jdropdown').renderItem = function(){}

Спасибо,

Ответы [ 2 ]

3 голосов
/ 01 июля 2015
  • Создать закрытие и сохранить оригинальный плагин для последующего использования;
  • Воссоздать плагин с тем же именем;
  • Делайте все, что хотите, и называйте оригинальный плагин.

    (function(){
        var originalPlugin = $.fn.pluginname;
    
        $.fn.pluginname = function(options) {
    
            var defaults = {
                someOption: 'string',
                anotherOption: { /* some object, if you need it ... */ }
            }
    
            var options = $.extend(defaults, options);
            var $this = $(this);
            $this.css('background-color', 'red'); // for example
    
            /* do something with '$this' applying any jquery */
    
            originalPlugin.apply(this, arguments);
        }
    })();
    
2 голосов
/ 28 ноября 2011

Передайте как опцию.

(function($){
    var options = {
       renderItem: function(){}
    };

    $.fn.jdropdown = function(method){
        $.extend(options, method);
        // plugin method despatcher
    };
 })(jQuery);

Затем использовать его:

$('.someThing').jdropdown({
    renderItem: function(){
        //something....
    }
});

Простой пример: http://jsfiddle.net/maniator/GxGz9/

...