Вопрос плагина jQuery - могу ли я изменить основной метод? - PullRequest
1 голос
/ 22 декабря 2009

Я разработал несколько плагинов jQuery, перед которыми следует формат $('#something').myPlugin() или $.myPlugin().

Я знаю, что вы также можете написать свои собственные селекторы.

Что мне было интересно, если бы я мог написать плагин, который изменяет, как работает метод css () , то есть если я запрашиваю сокращенный атрибут CSS (такой как padding), я мог бы вернуть что-то вроде этого

return $(this).css('padding-top') + ' ' + $(this).css('padding-right') + ' ' + $(this).css('padding-bottom') + ' ' + $(this).css('padding-left');

Возможно ли это? Как бы я это сделал, если так?

Спасибо

Ответы [ 4 ]

2 голосов
/ 22 декабря 2009

Возможно, но его использования в производстве следует избегать любой ценой .

Изменение основных функций библиотеки, которая часто используется в тандеме с несколькими плагинами, - плохая, опасная и плохая и опасная идея.

Возможно, вы сможете заставить перезаписанный метод взаимодействовать и вести себя по-своему и вести себя иначе только для подмножества параметров; тем не менее, в последующих выпусках библиотеки, если этот основной метод изменится, короче говоря, вы можете быть испорчены и вынуждены вернуться к перезаписанному методу.

Лучше использовать другое имя метода. Возможно, для ваших целей вы можете использовать style, xCss, cssExt или что-то в этом роде.

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

jQuery.fn.xCss = (function() {
    var compoundProperties = {
        'padding':    ['padding-top', 'padding-right' ...],
        'border':     ['border-width', 'border-style', ...],
        'background': ['background-color', ...],
        ...
    };

    return function(property, value) {
        // Use plugin functionality
        if ( compoundProperties.hasOwnPropery(property) ) { 
            // Get value
            if ( !value ) {
                var propertySet = compoundProperties[property],
                    result      = [];

                for ( var i=0, l=propertySet.length; i<l; ++i ) {
                    result.push( this.css(propertySet[i]) );
                }

                return result.join(" ");
            }

            // Set value
            ...
            return this;
        }

        // Use core functionality
        return this.css.apply(this, arguments);
    };
})();

* Код не проверен или не завершен.

1 голос
/ 22 декабря 2009

По сути, вам необходимо заменить метод jQuery. Советуем соблюдать крайнюю осторожность, так как вы можете сломать многие вещи, которые зависят от этого метода. Лучше всего выбрать другое имя.

Рассмотрим эту концепцию:

jQuery.fn.css_orig = jQuery.fn.css

jQuery.fn.css = function(arg1, arg2) {
    if(arg1 == 'what-I-want')
    { 
        return my_thing;
    } 
    else
    {
        return this.css_orig(arg1, arg2);
    }
};

В случае .css, я думаю, вы могли бы (если бы вы были очень осторожны ) сохранить 100% функциональности метода .css, добавив при этом свою функциональность сверху.

Классная идея, тем не менее!

0 голосов
/ 22 декабря 2009

Почему бы не создать пользовательскую функцию в пространстве имен вашего приложения, которая делает то, что вы хотите (ваши собственные бизнес-правила)?

К примеру, я не вижу много использования этой функции за пределами вашего текущего приложения ...

Мои 2 цента

EDIT: Привет Алекс, может ли уже встроенная функция помочь тебе?

Сокращенные свойства CSS (например, поле, background, border) не поддерживаются. Например, если вы хотите получить предоставленная маржа, используйте: $ (elem) .css ('marginTop') и $ (elem) .css ('marginRight') и т. д.

Полагаю, вы могли бы сделать то же самое с отступом?

http://docs.jquery.com/CSS/css#name

0 голосов
/ 22 декабря 2009

Вы можете переопределить методы jQuery по умолчанию, создавая плагины с тем же именем.

Есть еще немного информации об этом на Спросите Бена .

jQuery такой хорошо продуманный, мощная библиотека Javascript, что это на самом деле использует себя, чтобы построить себя. Я имею в виду, что многие из методы, предоставляемые JQuery библиотека фактически построена внутри в качестве плагинов к архитектуре JQuery. Когда вы начинаете думать о методы таким образом, это маленький прыжок, чтобы увидеть, что мы можем переопределить данный метод JQuery, просто создав новый плагин с тем же именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...