Najlepszy sposób na rozszerzenie wtyczki jQuery

Jestem całkiem nowym użytkownikiem jQuery, który chce rozszerzyć istniejącą wtyczkę jQuery, która robi około 75% tego, czego potrzebuję. Próbowałem odrobić pracę domową. Sprawdziłam następujące pytania na temat stackoverflow:

Przeczytałem na temat metody extend. Jednak wszystkie te zadania domowe mnie zdezorientowały. Pracuję. z fullcalendar plugin i trzeba zmodyfikować niektóre zachowanie, a także dodać nowe Hooki zdarzeń. Czy utknąłem z robieniem tego w samym zamknięciu wtyczki? Przegapiłem coś oczywistego?

Najlepiej byłoby, gdybyśmy mogli oddzielić nasz kod od kodu wtyczki, aby umożliwić ewentualną aktualizację. Każda pomoc byłaby bardzo mile widziana, szczególnie wskazówki dotyczące tego, gdzie brakuje mi informacji lub opinii na temat tego, czy rozwiązania już przedstawione w innych Przepełnieniach stosu pytania mają sens. Dla mnie zaprzeczają sobie i wciąż jestem zdezorientowany.

Author: Community, 2010-01-12

7 answers

Właśnie miałem ten sam problem, próbując rozszerzyć wtyczki jQuery UI, a oto rozwiązanie, które znalazłem (znalazłem przez jquery.ui.widget."js"): {]}


(function($) {
/**
 *  Namespace: the namespace the plugin is located under
 *  pluginName: the name of the plugin
 */
    var extensionMethods = {
        /*
         * retrieve the id of the element
         * this is some context within the existing plugin
         */
        showId: function(){
            return this.element[0].id;
        }
    };

    $.extend(true, $[ Namespace ][ pluginName ].prototype, extensionMethods);


})(jQuery);

Mam nadzieję, że to pomoże, proszę zapytać, jeśli masz jakieś pytania.
 83
Author: Jared Scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-11 00:05:38

Miałem ten sam problem i przyszedłem tutaj, a odpowiedź Jareda Scotta mnie zainspirowała.

(function($) {

    var fullCalendarOrg = $.fn.fullCalendar;

    $.fn.fullCalendar = function(options) {
        if(typeof options === "object") {
            options = $.extend(true, options, {
                // locale
                isRTL: false,
                firstDay: 1,
                // some more options
            });
        }

        var args = Array.prototype.slice.call(arguments,0);
        return fullCalendarOrg.apply(this, args);
    }

})(jQuery);
 17
Author: nepjua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-07 23:41:46

Odkryłem, że z wieloma wtyczkami metody są chronione / prywatne(tj. w zakresie zamknięć). Jeśli potrzebujesz zmodyfikować funkcjonalność metod / funkcji, to masz pecha, chyba że chcesz go rozwidlić. Teraz, jeśli nie musisz zmieniać żadnej z tych metod / funkcji, możesz użyć $.extend($.fn.pluginName, {/*your methods/properties*/};

Inną rzeczą, którą zrobiłem wcześniej, jest po prostu użycie wtyczki jako właściwości mojej wtyczki zamiast próbować ją rozszerzyć.

Wszystko sprowadza się do tego, jak wtyczka, którą chcesz rozszerzyć, jest zakodowana.

 3
Author: prodigitalson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 18:16:40
$.fn.APluginName=function(param1,param2)
{
  return this.each(function()
    {
      //access element like 
      // var elm=$(this);
    });
}

// sample plugin
$.fn.DoubleWidth=function()
  {
    return this.each(function()
      {
        var _doublWidth=$(this).width() * 2;
        $(this).width(_doubleWidth);
      });
  }

//

<div style="width:200px" id='div!'>some text</div>

// using custom plugin

$('#div1').DoubleWidth();

/// wyżej napisany Typ utili zwykle praca elementów dom /////////////// custom utils

(function($){
  var _someLocalVar;
  $.Afunction=function(param1,param2) {
    // do something
  }
})(jquery);

/ / dostęp powyżej util jako

$.Afunction();

/ / ten typ utili Zwykle rozszerza javascript

 2
Author: Praveen Prasad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 09:57:37

Moje podejście do przepisywania wtyczek jQuery polegało na przeniesieniu metod i zmiennych, które muszą być dostępne do bloku opcji i wywołaniu "extend"

// in the plugin js file
$.jCal = function (target, opt) {
    opt = $.extend({
       someFunctionWeWantToExpose: function() {
           // 'this' refers to 'opt', which is where are our required members can be found
       }
    }

    // do all sorts of things here to initialize

    return opt; // the plugin initialisation returns an extended options object
}


////// elsewhere /////

var calendar = $("#cal1").jCal();
calendar.someFunctionWeWantToExpose();
 1
Author: hvdd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-06 14:16:16

Przykład podobny do odpowiedzi Jareda Scotta, ale wykonanie kopii oryginalnego prototypu obiektu daje możliwość wywołania metody rodzica:

(function($) {

    var original = $.extend(true, {}, $.cg.combogrid.prototype);

    var extension = {
        _renderHeader: function(ul, colModel) {
            original._renderHeader.apply(this, arguments);

            //do something else here...
        }
    };

    $.extend(true, $.cg.combogrid.prototype, extension);

})(jQuery);
 1
Author: marcini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 09:21:17

Widget JQuery można rozszerzyć za pomocą jQuery Widget Factory.

(function ($) {
    "use strict";

    define([
        "jquery",
        "widget"
    ], function ($, widget) {
        $.widget("custom.yourWidget", $.fn.fullCalendar, {
            yourFunction: function () {
                // your code here
            }
        });

        return $.custom.yourWidget;
    });
}(jQuery));

Sprawdź dokumentację jQuery, aby dowiedzieć się więcej:
Widget Factory API
Rozszerzanie widgetów za pomocą Widget Factory

 0
Author: Max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 14:48:10