2014-12-19 3 views
0

У меня есть код ниже, который ограничивает ввод только номерами и выбирает количество комбинаций клавиш. Но я также хочу ограничить ввод только одной десятичной точкой.Нокаут - ограничивать ввод только номерами с одной десятичной точкой

number: { 
      init: function (element) { 
       // Allows only numbers with decimals 
       $(element).on("keydown", function (event) { 
        // Allow: backspace, delete, tab, escape, and enter 
        if (event.keyCode === 46 || event.keyCode === 8 || event.keyCode === 9 || event.keyCode === 27 || event.keyCode === 13 || 
         // Allow: Ctrl+A, Ctrl + C, Ctrl + V, Ctrl + X 
         ((event.keyCode === 65 || event.keyCode === 67 || event.keyCode === 86 || event.keyCode === 88) && (event.ctrlKey === true || event.metaKey === true)) || 
         // Allow: . 
         (event.keyCode === 190 || event.keyCode === 110) || 
         // Allow: home, end, left, right 
         (event.keyCode >= 35 && event.keyCode <= 39)) { 
         // let it happen, don't do anything 
         return; 
        } else { 
         // Ensure that it is a number and stop the keypress 
         if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { 
          event.preventDefault(); 
         } 
        } 
       }); 
      } 
     } 

Я пытался добавить '$(element).val().indexOf('.') !== -1', как показано ниже, но это ничего не делать, и я до сих пор можно ввести как много периодов, которые я хочу. Как я должен фактически ограничивать это?

if (event.shiftKey || ($(element).val().indexOf('.') !== -1 && (event.keyCode === 190 || event.keyCode === 110)) || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { 
       event.preventDefault(); 
         } 
+2

... а потом я приду вместе и вставьте вместо него «lorem ipsum». :-) –

+0

@ T.J.Crowder Не думал об этом ха-ха .. – user3312508

ответ

0
if ((yourString.match(new RegExp(".", "g")) || []).length > 1) { 
    // yourString contains more than one "." 
} 
1

Так что я должен сказать, что я действительно не вижу логики в разрешении явно; вместо этого вы должны явно исключать, так как по умолчанию все разрешено. Вы покупаете компьютер после того, как он прошел все ваши критерии, вы не покупаете 10 компьютеров, а затем выбрасываете те, которые не соответствуют вашим критериям. Таким образом, не нужно прикасаться к другим функциональным клавишам, вы делаете это излишне сложным.
Если вы внимательно посмотрите на свой чрезвычайно длинный пункт if, вы заметите следующее:
(event.keyCode === 190, согласно которому вы указали // let it happen, don't do anything. Таким образом, периоды всегда будут добавляться независимо. Вот с подводными камнями текущего подходом:

  • с keydown события, все коды клавиши производят то же значения с Caps Lock или нет, потому что они одни и те же ключей. Таким образом, вы не можете различать период . и точку с запятой ;.
  • с keydown события, коды клавиш для того же числа на цифровой клавиатуре и на клавиатуре разные, потому что они разные ключи.
  • Отключить ключ Shift (как и вы), заставляет пользователей AZERTY использовать Caps Lock, потому что клавиатура AZERTY создает нечисловой символ, когда Shift выключен.

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

$('#jquery').on("keypress", function (event) { 
    var k = event.keyCode || event.charCode; 
    if (k === 46 && this.value.match(/\./g) || (k < 48 && k !== 46) || k > 57) {        
    event.preventDefault(); 
    } 
}); 

Попробуй здесь: http://jsfiddle.net/kevinvanlierde/5ay3cory/6/

Примечание: Поскольку Mozilla Firefox сосет делает разницу между KeyDown и нажатия клавиши, его запутывает и отключает все клавиши управления.

+0

Это не служит моей цели. Он работает только правильно, если вы вводите период как первый символ, но не когда вы вводите его после любых других символов. – user3312508

0

Я установил свой собственный код и думал, что я разделю его здесь:

// Allows only numbers with decimals 
$(element).on("keydown", function(event) { 
    // Allow: backspace, delete, tab, escape, and enter 
    if (event.keyCode === 46 || event.keyCode === 8 || event.keyCode === 9 || event.keyCode === 27 || event.keyCode === 13 || 
     // Allow: Ctrl+A 
     (event.keyCode === 65 && (event.ctrlKey === true || event.metaKey === true)) || 
     // Allow: . 
     (event.keyCode === 190 || event.keyCode === 110) || 
     // Allow: home, end, left, right 
     (event.keyCode >= 35 && event.keyCode <= 39)) { 
     // let it happen, but check for excessive periods 
     if ((event.keyCode === 190 || event.keyCode === 110) && $(element).val().indexOf('.') !== -1) { 
      event.preventDefault(); 
     } 
     return; 
    } else { 
     // Ensure that it is a number and stop the keypress 
     if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { 
      event.preventDefault(); 
     } 
    } 
}); 

Я добавил следующий код, где он позволяет определенные коды клавиш:

if ((event.keyCode === 190 || event.keyCode === 110) && $(element).val().indexOf('.') !== -1) { 
    event.preventDefault(); 
} 
+0

Можно утверждать, что это лучше. Тем не менее, я исправил свой код, и теперь он работает так же хорошо, и лучше, потому что он не нарушает пользователей клавиатуры AZERTY, отключив Shift. (см. http://jsfiddle.net/kevinvanlierde/5ay3cory/6/, протестирован в Chrome, Opera, Mozilla FF, IE). У вашего собственного ответа и моего проблемы есть проблема с Firefox: ваш код не позволяет использовать период времени, а мой не позволяет управлять ключами (потому что Firefox отстойно реализует стандарты клавиатуры). – Tyblitz

Смежные вопросы