Есть ли способ предотвратить получение отрицательных значений input type="number"?



Я хочу получить только положительные значения, есть ли способ предотвратить это, используя только html

Пожалуйста, не предлагайте метод проверки



Screenshot of input control

708   12  

12 ответов:

использовать min атрибут такой:

<input type="number" min="0">

Я не был доволен @Abhrabm ответ потому что:

это только мешало отрицательный номера от ввода с стрелки вверх/вниз, в то время как пользователь может ввести отрицательное число с клавиатуры.

решение состоит в том, чтобы предотвратить с код:

// Select your input element.
var number = document.getElementById('number');

// Listen for input event on numInput.
number.onkeydown = function(e) {
    if(!((e.keyCode > 95 && e.keyCode < 106)
      || (e.keyCode > 47 && e.keyCode < 58) 
      || e.keyCode == 8)) {
        return false;
    }
}
<form action="" method="post">
  <input type="number" id="number" min="0" />
  <input type="submit" value="Click me!"/>
</form>

разъяснение @Hugh Guiney:

какой ключ коды проверяются:

  • 95,
  • 47,

таким образом, этот скрипт предотвращает ввод недопустимого ключа во вход.

для меня решением было:

<input type="number" min="0" oninput="this.value = Math.abs(this.value)">

этот код работает нормально для меня. Пожалуйста, проверьте:

<input type="number" name="test" min="0" oninput="validity.valid||(value='');">

простой способ:

<input min='0' type="number" onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57">

ответ @Manwal хорош, но мне нравится код с меньшим количеством строк кода для лучшей читаемости. Также мне нравится использовать использование onclick/onkeypress в html вместо этого.

мой предлагаемое решение делает то же самое: Добавить

min="0" onkeypress="return isNumberKey(event)"

на вход html и

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : event.keyCode;
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

как функция javascript.

Как уже было сказано, он делает то же самое. Это просто личные предпочтения о том, как решить проблему.

просто для справки: с помощью jQuery вы можете перезаписать отрицательные значения на focusout следующим кодом:

$(document).ready(function(){
    $("body").delegate('#myInputNumber', 'focusout', function(){
        if($(this).val() < 0){
            $(this).val('0');
        }
    });
});

это не заменяет проверку на стороне сервера!

вот угловое решение 2:

создать класс OnlyNumber

import {Directive, ElementRef, HostListener} from '@angular/core';

@Directive({
  selector: '[OnlyNumber]'
})
export class OnlyNumber {

  // Allow decimal numbers. The \. is only allowed once to occur
  private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);

  // Allow key codes for special events. Reflect :
  // Backspace, tab, end, home
  private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home'];

  constructor(private el: ElementRef) {
  }

  @HostListener('keydown', ['$event'])
  onKeyDown(event: KeyboardEvent) {
    // Allow Backspace, tab, end, and home keys
    if (this.specialKeys.indexOf(event.key) !== -1) {
      return;
    }

    // Do not use event.keycode this is deprecated.
    // See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
    let current: string = this.el.nativeElement.value;
    // We need this because the current value on the DOM element
    // is not yet updated with the value from this event
    let next: string = current.concat(event.key);
    if (next && !String(next).match(this.regex)) {
      event.preventDefault();
    }
  }
}

добавить OnlyNumber к объявлениям в приложении.модуль.ts и использовать, как это, как это в любом месте вашего приложения

<input OnlyNumber="true">

<input type="number" name="credit_days" pattern="[^\-]+" 
    #credit_days="ngModel" class="form-control" 
    placeholder="{{ 'Enter credit days' | translate }}" min="0" 
    [(ngModel)]="provider.credit_days"
    onkeypress="return (event.charCode == 8 || event.charCode == 0 || 
    event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 
    57" onpaste="return false">

это решение позволяет все функции клавиатуры, включая копирование вставить с клавиатуры. Это предотвращает вставку отрицательных чисел с помощью мыши. Он работает со всеми браузерами и демо на codepen использует bootstrap и jQuery. Это должно работать с неанглоязычными настройками и клавиатурами. Если браузер не поддерживает захват событий вставки (IE), он удалит отрицательный знак после фокусировки. Это решение ведет себя так, как должен вести себя собственный браузер с min=0 типовое число.

разметка:

<form>
  <input class="form-control positive-numeric-only" id="id-blah1" min="0" name="nm1" type="number" value="0" />
  <input class="form-control positive-numeric-only" id="id-blah2" min="0" name="nm2" type="number" value="0" />
</form>

Javascript

$(document).ready(function() {
  $("input.positive-numeric-only").on("keydown", function(e) {
    var char = e.originalEvent.key.replace(/[^0-9^.^,]/, "");
    if (char.length == 0 && !(e.originalEvent.ctrlKey || e.originalEvent.metaKey)) {
      e.preventDefault();
    }
  });

  $("input.positive-numeric-only").bind("paste", function(e) {
    var numbers = e.originalEvent.clipboardData
      .getData("text")
      .replace(/[^0-9^.^,]/g, "");
    e.preventDefault();
    var the_val = parseFloat(numbers);
    if (the_val > 0) {
      $(this).val(the_val.toFixed(2));
    }
  });

  $("input.positive-numeric-only").focusout(function(e) {
    if (!isNaN(this.value) && this.value.length != 0) {
      this.value = Math.abs(parseFloat(this.value)).toFixed(2);
    } else {
      this.value = 0;
    }
  });
});
oninput="this.value=(this.value   < Number(this.min) || this.value   > Number(this.max))  ? '' : this.value;"

вот решение, которое лучше всего работало для поля кол-во, которое допускает только числа.

// Only allow numbers, backspace and left/right direction on QTY input
    if(!((e.keyCode > 95 && e.keyCode < 106) // numpad numbers
        || (e.keyCode > 47 && e.keyCode < 58) // numbers
        || [8, 9, 35, 36, 37, 39].indexOf(e.keyCode) >= 0 // backspace, tab, home, end, left arrow, right arrow
        || (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + A
        || (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + C
        || (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + X
        || (e.keyCode == 86 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + V
    )) {
        return false;
    }

Comments

    Ничего не найдено.