jQuery числовое текстовое поле с минутой и макс. диапазонами

я вижу этот вопрос, но ни одно из решений не поддерживает минуту, и макс. оценивает диапазон

Как позволить только числовой (0-9) в HTML inputbox использование jQuery?

Я вижу, что http://jstepper.emkay.dk/ пытается сделать это, но кажется очень ошибочным, поскольку это позволяет Вам вводить несколько десятичных разрядов и другие символы такой как"";.

есть ли я способ, которым я могу использовать одно из этих решений и также сказать, только поддерживать минуту 0 и макс. 100 в записи текстового поля?

5
задан Community 23 May 2017 в 10:31
поделиться

5 ответов

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

Так что попробуйте еще раз и посмотрите, работает ли он сейчас :)

.
19
ответ дан 18 December 2019 в 05:31
поделиться

Вот пример того, как может выглядеть ваш скрипт:

var value, min=6, max=100;

function isNumberPressed(k) {
    // 48-57 are number 0-9 on a normal keyboard, 96-105 are keypad numbers
    return (k > 47 && k < 58) || (k > 95 && k < 106) ? true : false;
}

function isValidNumber(v){
    // Check if a valid number is entered
    return (parseInt(v, 10) >= min && parseInt(v, 10) <= max) ? true : false;
}

$(document).ready(function() {
    $("#test").keydown(function(e) {
        // See if a valid key is pressed
        if(isNumberPressed(e.keyCode)){
            if(isValidNumber($(this).val())) value = $(this).val();
        } 
        // Do nothing if unallowed keys are pressed
        else if(e.keyCode != 46 && e.keyCode != 8) return false;
    }).keyup(function(){
        // If the value, including the latest number that's added, is not valid (to high or to low), show the old value again
        if(isValidNumber($(this).val()) == false){
            $(this).val(value);
        }
    });
});

Но у него есть большой недостаток, вы не можете ввести 26, если минимум 6, потому что 2 < 6. Это не проблема, если у вас есть минимум меньше или равно 10.

Однако, если ваш минимум больше 10, вы можете рассмотреть этот код:

var timer, min=36, max=100;

function isValidNumber(v){
    // Check if a valid number is entered
    return (parseInt(v, 10) >= min && parseInt(v, 10) <= max) ? true : false;
}

$(document).ready(function() {
    $("#test").keydown(function(e) {
        that = this;

        // Clear the timer
        if(timer)
            clearTimeout(timer);

        // Set a new timer with a delay of one second
        timer = setTimeout(function(){
            if(isValidNumber($(that).val()) == false) $(that).addClass('error');
            else $(that).removeClass('error');
        }, 1000);        
    });
});

Он проверяет вход с задержкой в одну секунду. Для этого нужен какой-нибудь CSS код, например:

input.error {
    border: 2px solid red;
}

Оба скрипта проверяют значения на лету, что является отличным методом.

1
ответ дан 18 December 2019 в 05:31
поделиться

Создайте текстовое поле пользовательского типа, которое принимает только диапазоны. Что-то подобное должно работать:

function RangeTextBox(min, max) {
    this.min = min;
    this.max = max;
    this.textBox = $("<input type='text'>");

    // Disallow non-numbers from being typed in box
    this.textBox.keydown(function(event) {
        var isNotBackspaceOrDelete = event.keyCode != 46 && event.keyCode != 8;
        var isNotInteger = event.keyCode < 48 || event.keyCode > 57;
        if(isNotBackspaceOrDelete && isNotInteger) {
            event.preventDefault();
        }
    });
    // Check for a valid range
    this.textBox.keyup(function(event) {
        var textBox = event.target;
        var isNotInRange = (textBox.value < min) || (textBox.value > max);
        if (isNotInRange) {
            textBox.value = textBox.value.slice(0, -1);
        }
    });

    return this.textBox;
}

Чтобы использовать его, просто создайте новое текстовое поле, вызвав новое RangeTextBox(min, max). For example

$(document).ready(function() {
    $("body").append(new RangeTextBox(1, 18));
});

Disclaimer: При этом возникает та же проблема, что и у Хармена в другом ответе поля, который не принимает значение типа 2 для числа "26", если минимальное значение 6 как 2 < 6. Вы можете использовать таймер, или фактически перенести эту проверку за пределы событий keyup и keyydown и вместо этого проверить onblur или onchange. Это позволит ввести в поле недействительные данные, но гораздо менее раздражающие.

Правка: Это решение позволяет вводить что угодно, но помечает все неверные данные, в том числе и вне диапазонов.

function RangeTextBox(min, max) {
    this.min = min;
    this.max = max;
    this.textBox = $("<input type='text'>");

    // Check for a valid range
    this.textBox.keyup(function(event) {
        var textBox = event.target;
        var value = parseInt(textBox.value);
        var isNotNumeric = !/^[0-9]+$/.test(textBox.value);
        var isOutsideRange = (value < min) || (value > max);
        if (isNotNumeric || isOutsideRange) {
            $(textBox).addClass('error');
        }
        else {
            $(textBox).removeClass('error');
        }
    });

    return this.textBox;
}

И таблица стилей:

<style type="text/css">
.error {
    color: red;
}
3
ответ дан 18 December 2019 в 05:31
поделиться

Я создал jQuery SpinControl , который поддерживает min, max и step. Сначала он проверяет, поддерживается ли уже SpinControl браузером (Opera), прежде чем добавить пользовательский.

1
ответ дан 18 December 2019 в 05:31
поделиться

HTML5 способ добавления таких полей. Работает в Chrome и Safari:

<input type="range" min="0" max="100" step="1" />

Полный пример:

<input id="picker" type="range" min="0" max="100" step="1" onchange="$('#pickerValue').text(this.value)" />
<div id="pickerValue"></div>
8
ответ дан 18 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: