Лучший способ расширения плагина jQuery
Я довольно новый пользователь jQuery, который хочет расширить существующий плагин jQuery, который составляет около 75% того, что мне нужно. Я пытался сделать домашнее задание. Я проверил следующие вопросы о stackoverflow:
У меня читать по методу расширения. Однако вся эта домашняя работа оставила меня в замешательстве. Я работаю с плагином fullcalendar и должен изменить некоторые из этих действий, а также добавить новые крючки событий. Я застрял с этим в самом закрытии плагина? Мне что-то не хватает?
В идеале мы могли бы отделить наш код от кода плагина, чтобы обеспечить возможное обновление. Любая помощь будет принята с благодарностью, особенно указатели на то, где мне не хватает информации или мнений о том, имеют ли смысл решения, уже представленные в других вопросах. Мне они противоречат друг другу, и я все еще не смущен.
Ответы
Ответ 1
У меня была одна и та же проблема с расширением jQuery UI-плагинов, и вот решение, которое я нашел (нашел его через 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);
надеюсь, что это поможет, спросите, есть ли у вас какие-либо вопросы.
Ответ 2
У меня была такая же проблема, и я пришел сюда, а потом Джаред Скотт ответил, вдохновил меня.
(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);
Ответ 3
Ive обнаружил, что с большим количеством плагинов методы защищены/приватными (т.е. в области закрытия). Если вам нужно изменить функциональность методов/функций, тогда вам не повезло, если вы не захотите его разветкить. Теперь, если вам не нужно менять какой-либо из этих методов/функций, вы можете использовать $.extend($.fn.pluginName, {/*your methods/properties*/};
Еще одна вещь, с которой я закончил, - это просто использовать плагин как свойство моего плагина, а не пытаться его расширить.
В чем все это происходит, так это то, как плагин, который вы хотите расширить, закодирован.
Ответ 4
$.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>
//
используя пользовательский плагин
$('#div1').DoubleWidth();
///
над написанным типом utils обычно работают элементы dom
///////////////
custom utils
(function($){
var _someLocalVar;
$.Afunction=function(param1,param2) {
// do something
}
})(jquery);
//доступ сверху используется как
$.Afunction();
//этот тип utils обычно расширяет javascript
Ответ 5
Мой подход при переписывании плагинов jQuery состоял в том, чтобы перемещать методы и переменные, к которым нужно получить доступ к блоку опций, и вызвать "продлить"
// 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();
Ответ 6
Пример, похожий на ответ Джареда Скотта, но создание копии исходного прототипа объекта дает возможность вызвать родительский метод:
(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);
Ответ 7
jQuery Widget может быть расширен с помощью 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));
Посмотрите документацию jQuery, чтобы узнать больше:
Виджет Factory API
Расширение виджета с помощью виджета Factory