http://jsbin.com/ruhaxo/9/edit
Ваш код сделал мне немного неудобно, так что я пытался написать это более просто, так что было бы легче читать, вы можете вытащить часть, что вам нужно, что я действительно думаю, что это просто event.preventDefault(), когда есть совпадение. Просто для расширения, а также: http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes вы ищете коды символов не буквальные числа.
$('input').on('keypress', function (e) {
var leng = $(this).val().length;
if (window.event) {
code = e.keyCode;
}else {
code = e.which;
};
var allowedCharacters = [49,50,51,52,53,54,55,56,57,48,45];
var isValidInput = false;
for (var i = allowedCharacters.length - 1; i >= 0; i--) {
if(allowedCharacters[i] == code){
isValidInput = true;
}
};
if(isValidInput === false || /* Can only input 1,2,3,4,5,6,7,8,9 or - */
(code == 45 && (leng < 2 || leng > 5 || leng == 3 || leng == 4)) ||
((leng == 2 || leng == 5) && code !== 45) || /* only can hit a - for 3rd pos. */
leng == 10) /* only want 10 characters "12-45-7890" */
{
event.preventDefault();
return;
}
});
Вы также можете сделать это с помощью объекта, а не массива. Что немного легче читать:
$('input').on('keypress', function (e) {
var leng = $(this).val().length;
if (window.event) {
code = e.keyCode;
}else {
code = e.which;
};
var allowedCharacters = {49:1,50:2,51:3,52:4,53:5,54:6,55:7,56:8,57:9,48:0,45:'-'}; /* KeyCodes for 1,2,3,4,5,6,7,8,9,- */
if(typeof allowedCharacters[code] === 'undefined'|| /* Can only input 1,2,3,4,5,6,7,8,9 or - */
(code == 45 && (leng < 2 || leng > 5 || leng == 3 || leng == 4)) ||
((leng == 2 || leng == 5) && code !== 45) || /* only can hit a - for 3rd pos. */
leng == 10) /* only want 10 characters "12-45-7890" */
{
event.preventDefault();
return;
}
});
Редакцией:
Пожалуйста, будьте осторожны с этим, я не в полной мере испытал это, но я редактировал регулярное выражение с поста упоминалось выше, если у вас есть это в дополнение к одному из других вариантов выше (это происходит при активации клавиатуры после того, как были сделаны другие проверки), это подтвердило бы дату в формате mm-dd-yyyy, пожалуйста, проверьте, что она работает правильно, я пробовал 02-29-2008, первый високосный год, о котором я мог думать, и это сработало, но я бы рекомендовал тестировать его больше, так как он был изменен.
$('input').on('keyup',function(e){
/* From:
http://stackoverflow.com/questions/17503043/javascript-regular-expression-to-validate-date-in-mm-dd-yyyy-format
and
http://jsfiddle.net/LSsMc/
*/
var thisVal = $(this).val();
var leng = thisVal.length;
var reg = new RegExp(/^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g);
if(leng == 10){
if(reg.test(thisVal)){
console.log('Valid Date');
}else {
event.preventDefault();
return;
}
}
});
Регулярное выражение в вашем примере соответствует полному формату даты, не ограничивая то, что можно ввести. Кроме того, вы используете двойной эквивалент для назначения шаблона. – getWeberForStackExchange
Ошибка Typo на знаке двойного равенства, поэтому проверка даты должна быть в отпуске на входе? – bumbumpaw
Извините, мое первое сообщение было немного коротким. Если я правильно понял вопрос, вы хотели бы, чтобы пользователь вводил дату в точно определенном формате, когда они печатают его. Таким образом, они не могли вводить буквы или что-то еще, только два числа, дефис, еще два числа, дефис и четыре числа. Это цель? – getWeberForStackExchange