#jquery #javascript #плагин #функции
Для тренировки делаю плагин, открывающий/закрывающий всплывающие окна. Соответственно в нем должны быть методы: открыть окно, закрыть окно и т.д. Эти методы должны вызываться, как внутри плагина, при совершении определенных действий, так и извне: $('#box').plugin.close() или $('#box').plugin('close'); Я перечитал все мануалы, возможные структуры плагинов. Сейчас он реализован с помощью стандартной структуры, когда методы init, destroy выделены в объект methods. Но я не понимаю, как правильно реализовать метод close. Я не понимаю, какие параметры ему нужно передавать, или как его вызывать, чтобы он видел переменные определенные в теле функции плагина. Вот примерная структура: (function( $ ){ var pop = function(element, options, callback1st, callback2nd) { var elem = $(element), obj = this, self = $(this); var settings = $.extend({ openSpeed: '300', closeSpeed:'300', openAnim: 'default', closeAnim: 'default', method: 'default', checkboxShow: '3', callback1st: 'default', callback2nd: 'default' }, options || {} ); var mpControl = elem.find(".mpcontrol"), mpContent = elem.find("div.mpcontent"); //логика работы } var methods = { init:function() {}, close:function() {} } $.fn.milkpop = function( method, callback1st, callback2nd ) { //вызываем метод или инициализируем плагин }; })( jQuery ); Мне нужно, чтобы переменные mpControl и mpContent для конкретного экземпляра были доступны внутри метода Close() Как правильно это реализовывать? Чтобы метод мог вызываться внутри и снаружи плагина и взаимодействовал со всеми его перменными. Апдейт Из того, что придумал после написания поста. Записать управляющие элементы в data, для элемента к которому применяется плагин. Дальше внутри метода вытаскивать эти объекты и работать с ними (мне не очень нравится) Записать управляющие объекты в массив settings. Передавать его в функцию Close(), т.к. он там все равно нужен для выбора скорости и эффекта. Там считывать с него. var settings = $.extend({ controlEl: elem.find(".mpcontrol"), contentEl: elem.find("div.mpcontent") }, options || {} ); methods.close.call(elem, settings); Уже все работает, осталось получить уверенность в том, что это правильный подход :)
Ответы
Ответ 1
Правильнее всего использовать jquery Widget Factory. Я тут сделал демонстрационный пример, как создать плагин пользуясь данной методикой, это поможет вам обойти все подводные камни: http://codepen.io/lukas-pierce/pen/zNVgMK (function($) { $.widget("custom.milkpop", { // параметры по умолчанию options: { bgColor: 'red', //цвет фона для ссылки открывающей модалку content: 'Hello world!', // Callbacks beforeShow: null, afterShow: null }, // Конструктор _create: function() { //контекст уже содержит ссылку на jquery объект DOM-элемента this.element.css('background-color', this.options.bgColor); this._on(this.element, { click: "open" }); }, // public method (начинается без префикса _) open: function(e) { e.preventDefault && e.preventDefault(); this._trigger("beforeShow"); //заглушка, put your code for open modal here alert(this.options.content); this._trigger("afterShow"); } }); })(jQuery);
Комментариев нет:
Отправить комментарий