я вижу этот вопрос, но ни одно из решений не поддерживает минуту, и макс. оценивает диапазон
Как позволить только числовой (0-9) в HTML inputbox использование jQuery?
Я вижу, что http://jstepper.emkay.dk/ пытается сделать это, но кажется очень ошибочным, поскольку это позволяет Вам вводить несколько десятичных разрядов и другие символы такой как"";.
есть ли я способ, которым я могу использовать одно из этих решений и также сказать, только поддерживать минуту 0 и макс. 100 в записи текстового поля?
Я автор jStepper и я только что обновил плагин, чтобы иметь возможность делать то, что вам нравится.
Так что попробуйте еще раз и посмотрите, работает ли он сейчас :)
.Вот пример того, как может выглядеть ваш скрипт:
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;
}
Оба скрипта проверяют значения на лету, что является отличным методом.
Создайте текстовое поле пользовательского типа, которое принимает только диапазоны. Что-то подобное должно работать:
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;
}
Я создал jQuery SpinControl , который поддерживает min, max и step. Сначала он проверяет, поддерживается ли уже SpinControl браузером (Opera), прежде чем добавить пользовательский.
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>