Опция плагина jQuery не разрешается при событии элемента - PullRequest
0 голосов
/ 24 марта 2011

У меня проблемы с созданием плагина ниже. Переменная «factorOf» в функции «roundWholeNumber» всегда разрешается как «неопределенная». Я предполагаю, что это потому, что я не настраиваю событие правильно. Спасибо за любую помощь.

С учетом следующего HTML:

<input type="text" value="12" class="rounder-wholeNumber" />

Проверка с использованием следующего селектора:

jQuery('input.rounder-wholeNumber').numericRounder({ onEvent: 'change', factorOf: 1000 })

Для следующего плагина:

(function($) {
    /// <summary>Creates and initializes the plug-in.</summary>
    $.fn.extend({
        numericRounder: function(options) {

            switch (typeof (options)) {
                case 'object':
                    options = $.extend({}, $.numericRounder.defaults, options);
                    break;
                case 'string':
                    options = $.extend({}, $.numericRounder.defaults, { onEvent: options });
                    break;
                default:
                    options = $.numericRounder.defaults;
            }

            this.each(function() {
                new $.numericRounder(this, options);
            });
            return;
        }
    });

    /// <summary>Plug-in definition.</summary>
    $.numericRounder = function(control, options) {

        var element = $(control);

        if (element.is('input.rounder-decimal')) {
            switch (options.onEvent) {
                case 'change':
                    element.change(roundDecimal);
                    break;
                case 'blur':
                    element.blur(roundDecimal);
                    break;
                case 'click':
                    element.click(roundDecimal);
                    break;
                default:
                    element.blur(roundDecimal);
            }
        }

        if (element.is('input.rounder-wholeNumber')) {
            switch (options.onEvent) {
                case 'change':
                    element.change(function(options) { roundWholeNumber(this, options.factorOf); });
                    break;
                case 'blur':
                    element.blur(function(options) { roundWholeNumber(this, options.factorOf); });
                    break;
                case 'click':
                    element.click(function(options) { roundWholeNumber(this, options.factorOf); });
                    break;
                default:
                    element.blur(function(options) { roundWholeNumber(this, options.factorOf); });
            }
        }

        /// <summary>Rounds a numeric value to the nearest place.</summary>
        function roundDecimal() {

            var value = $(this).val();
            value = extractValue(value);

            if (isNaN(value))
                value = $(this).val();
            else
                value = Math.round(value).toFixed(2);

            $(this).val(value);
        }
        /// <summary>Rounds a numeric value to the nearest place.</summary>
        function roundWholeNumber(element, factorOf) {

            var value = $(element).val();
            value = extractValue(value);

            if (isNaN(value))
                value = $(element).val();
            else
                value = Math.round(value / factorOf) * factorOf;

            $(element).val(value);
        }
        /// <summary></summary>
        function extractValue(element) {
            var numericRegEx = /([\d\.])/g;

            try {
                return element.match(numericRegEx).join('');
            }
            catch (error) {
                return element;
            }
        }
    };

    /// <summary>Default options.</summary>
    $.numericRounder.defaults = { onEvent: 'change', factorOf: 10 };
})(jQuery);

1 Ответ

0 голосов
/ 24 марта 2011

Вы используете анонимные функции привязки. Смотрите, когда вы будете связывать, как это

element.change(function(options) { roundWholeNumber(this, options.factorOf); });

options переменная становится event object, установленным jQuery.

element.change( function(options) { options.preventDefault(); }  ) //see ?:)

Просто избавьтесь от options в определении, и оно будет успешно оценено внутри функции.

element.change(function() { roundWholeNumber(this, options.factorOf); });
...