Создание плагина jquery с динамической загрузкой расширений функций - PullRequest
2 голосов
/ 15 апреля 2010

Динамические расширения плагинов

Я ищу методы, позволяющие плагину jquery или библиотеке javascript на основе jquery автоматически и динамически добавлять расширения к себе на основе текущей среды, в которой они находятся. По сути, я хочу иметь возможность повторно использовать некоторые полезные функции из других плагинов, если на страницу загружены другие плагины. Если мой плагин обнаружит, что они не загружены, я хочу загрузить собственную версию этих функций.

Например, моему плагину нужны функции разбора и форматирования даты. Один из популярных способов сделать это - использовать parse () и toString () DateJS . Но DateJS - довольно тяжелый плагин, и мой плагин не нуждается в каких-либо функциях, которые он имеет. Другие плагины имеют некоторые похожие функции, такие как DatePicker , FullCalendar и т. Д. Если какой-либо из этих плагинов используется на странице, я бы не стал загружать избыточный и избыточный код в моем плагине и просто используйте функции другого плагина вместо этого.

Итак, я хотел бы предоставить собственную упрощенную версию parse () и format () во внешнем файле из основного файла плагина. Если не используются никакие другие плагины, обеспечивающие необходимые функции parse () и format (), тогда основной файл плагина будет загружать мой плагин для расширения дат.

Если мой основной плагин обнаружит, что какой-либо из плагинов DateJS, UI DatePicker или FullCalendar загружен, то он загрузит для него простое расширение-обертку, которое обеспечит необходимые функции parse () и format (). Эти функции в основном просто вызывают функции синтаксического анализа и форматирования другого плагина.

Вопросы

  1. Как лучше всего определить функцию, чтобы определить, загружен ли плагин?
  2. Как мне динамически загрузить соответствующий дополнительный скрипт расширения?
  3. Как мне убедиться, что я не загружаю несколько расширений, переопределяя друг друга?
  4. Существуют ли другие плагины, которые расширяются? Я хотел бы изучить их, чтобы увидеть, как они это делают.

Подробный пример

Если это поможет лучше понять вопрос, я представляю такие файлы:

myplugin.js
myplugin-dates.js
myplugin-wrap-datejs.js
myplugin-wrap-datepicker.js
myplugin-wrap-fullcalendar.js

Файл myplugin.js будет выглядеть примерно так (обратите внимание, что это не настоящий плагин jquery, а скорее глобально зарегистрированная библиотека):

var MYPLUG = (function (parent, $) {

    var MYPLUG = parent;

    // Public functions
    MYPLUG.doSomething = function(dateString) { 
        ...
        var date = MYPLUG.Dates.parse(dateString);
        ...
        var prettyDate = MYPLUG.Dates.format(date);
        ...
    };

    return parent;
}(MYPLUG || {}, jQuery));

Файл myplugin-date.js будет выглядеть примерно так:

var MYPLUG = (function (parent, $) {
    var Dates = parent.Dates = parent.Dates || {};

    Dates.parse = function(dateString) {
        // Custom code to parse dateString to a date
    }                       

    Dates.format = function(dateObj) {
        // Custom code to format dateObj as a string
    }                       

    return parent;
}(MYPLUG || {}, jQuery));

Наконец, расширение для переноса плагинов myplugin-wrap-fullcalendar.js может выглядеть так:

var MYPLUG = (function (parent, $) {
    var Dates = parent.Dates = parent.Dates || {};

    Dates.parse = function(dateString) {
        return $.fullCalendar.parseDate(dateString);
    }                       

    Dates.format = function(dateObj) {
        return $.fullCalendar.formatDate(dateObj, "mm/dd/yy");
    }                       

    return parent;
}(MYPLUG || {}, jQuery));

1 Ответ

0 голосов
/ 04 мая 2011

Я верю RequireJS , Ajax Script Loader или любой другой модуль загрузки скриптов поможет вам разумно управлять вашим скриптом и разрешать отложенную загрузку скриптов только тогда, когда вам это действительно нужно.

...