क्या नकारात्मक प्रकार प्राप्त करने वाले इनपुट प्रकार = "संख्या" को रोकने का कोई तरीका है?


302

मैं केवल सकारात्मक मान प्राप्त करना चाहता हूं, क्या केवल html का उपयोग करके इसे रोकने का कोई तरीका है
कृपया सत्यापन विधि का सुझाव न दें

इनपुट नियंत्रण का स्क्रीनशॉट


3
यह धागा उसी प्रश्न का बहुत बेहतर तरीके से जवाब देता है: stackoverflow.com/questions/31575496/…
PiotrWolkowski

जवाबों:


658

इस तरह की minविशेषता का उपयोग करें:

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


222
यह तीर बटन / स्पिनर का उपयोग करके प्रवेश करने से एक नकारात्मक संख्या को अवरुद्ध करेगा। हालाँकि, उपयोगकर्ता अभी भी एक नकारात्मक संख्या में मैन्युअल रूप से दर्ज कर सकता है और उस क्षेत्र का मान ऋणात्मक संख्या के रूप में पढ़ा जाता है, इस प्रकार न्यूनतम विशेषता को दरकिनार कर देता है।
इब्रोड्री

52
@demaniak नहीं। और इस सवाल का जवाब कैसे मिला, जब इस सवाल का आधा जवाब एक रहस्य है
GöTô

1
@Abraham क्या डेटा के रूप में -ve मान के साथ लोड होने पर, यह इसे लाल के रूप में चिह्नित नहीं करता है।
कामिनी

2
यह काम नहीं करता है, उपयोगकर्ता अभी भी मैन्युअल रूप से एक नकारात्मक संख्या दर्ज कर सकता है।
अल्टेफ चार

129

मैं @ जवाब के साथ संतुष्ट नहीं था क्योंकि:

यह केवल नकारात्मक संख्याओं को ऊपर / नीचे तीर से प्रवेश करने से रोक रहा था, जबकि उपयोगकर्ता कीबोर्ड से नकारात्मक संख्या टाइप कर सकता है।

समाधान कुंजी कोड के साथ रोकने के लिए है :

// 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>

@ हेग गुनी द्वारा प्रदान किया गया स्पष्टीकरण :

किन प्रमुख कोड की जाँच की जा रही है:

  • 95, <106 9 के माध्यम से नंपाद 0 से मेल खाती है;
  • 47, <58 नंबर रो पर 9 के माध्यम से 0 से मेल खाती है; और 8 बैकस्पेस है।

इसलिए यह स्क्रिप्ट अमान्य कुंजी को इनपुट में दर्ज होने से रोक रही है।


20
अपवित्र लेकिन मुझे लगता है कि यह स्पष्ट करने में मदद करेगा कि किन प्रमुख कोड की जाँच की जा रही है:> 95, <106 Numpad 0 से 9 से मेल खाती है; > 47, <58 नंबर रो पर 9 के माध्यम से 0 से मेल खाती है; और 8 बैकस्पेस है। इसलिए यह स्क्रिप्ट किसी भी कुंजी को रोक रही है, लेकिन उन्हें प्रवेश करने से रोक रही है। यह पूरी तरह से है, लेकिन मुझे लगता है कि यह उन ब्राउज़रों के लिए ओवरकिल हो सकता है जो मूल रूप से नंबर इनपुट का समर्थन करते हैं, जो पहले से ही वर्णानुक्रमिक कुंजी ("ई" जैसे वर्णों को छोड़कर जो एक संख्यात्मक अर्थ हो सकता है) को फ़िल्टर करते हैं। यह शायद 189 (डैश) और 109 (घटाना) को रोकने के लिए पर्याप्त होगा। और फिर के साथ गठबंधन min="0"
ह्यूग गाइनी

1
@ मैनवाल यह कीबोर्ड का उपयोग करके संख्याओं को कॉपी और पेस्ट करने के लिए प्रतिबंधित करता है। और मुझे माउस का उपयोग करके नकारात्मक संख्याओं को कॉपी करने की अनुमति देता है।
बेनिटन

1
@ बेनिटन इस उपयोग के मामले को धन्यवाद देते हैं। क्या आप मुझे थोड़ा सा विचार दे सकते हैं कि आप क्या कर रहे हैं। वैसे मैं आपकी मदद कर सकता हूं। कृपया थोड़ा सा रन कोड या फिडल प्रदान करें। आपके पास अपने कोड के लिए सबमिट स्तर सत्यापन हो सकता है। हालांकि मैं हमेशा बैकएंड में चेक करता हूं अगर मैं नकारात्मक संख्या की अनुमति नहीं देता हूं।
मानवल

1
बस मूल रूप से क्षेत्र में कॉपी-पेस्ट करें। यह वास्तव में एक विशेष मामला या कुछ भी नहीं है। कीकोड के माध्यम से मान्यता को संभालने के बजाय, शायद यह बेहतर है कि इसे चालू करें या फ़ोकट करें और किसी भी नकारात्मक संख्या को पकड़ने के लिए थोड़ा सत्यापन कार्य करें।
ulisesrmzroche

1
तीर कुंजी (37, 38, 39, 41) के लिए शर्त भी लगाई जानी चाहिए। || (e.keyCode>36 && e.keyCode<41)यह उपयोगकर्ता को ऊपर / नीचे तीर के माध्यम से संख्या को बढ़ाने / घटाने की अनुमति नहीं देता है और संख्या को संपादित करने के लिए दाएं / बाएं जाता है।
वसन

86

मेरे लिए समाधान था:

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

1
वास्तव में सबसे अच्छा समाधान एक बार जब आप पैटर्न का उपयोग करते हैं और कोणीय के साथ noformvalidate करते हैं, क्योंकि मॉडल को अद्यतन नहीं किया जाता है यदि सीमा के भीतर नहीं। मेरा मामला:<input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="..." noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) ">
sebius

जब उपयोगकर्ता डिफ़ॉल्ट मान जानता है तो यह सबसे अच्छा काम करता है। अन्य बुद्धिमान उपयोगकर्ता बैकस्पेस प्रेस पर भ्रमित हो जाते हैं कि फ़ील्ड क्लीयर क्यों नहीं हो रहा है। इसे छोड़कर, यह सबसे अच्छा समाधान है। + 1
दीप 3015

1
आपने
बजे

यह एक सबसे अच्छा काम करता है, और दशमलव का उपयोग करने के मामले में भी। मैंने ऊपर अन्य उत्तर का उपयोग किया था, यह तब काम करना बंद कर दिया जब दशमलव की अनुमति दी जानी है। क्या इस तरह से हम इस उत्तर को आगे बढ़ा सकते हैं ताकि लोग इसका इस्तेमाल कर सकें।
सुभान अहमद

31

यह कोड मेरे लिए ठीक काम कर रहा है। क्या तुम इसे जांचोगे:

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

2
यह काम करता है लेकिन टाइप करने की कोशिश करने के बाद पूरे इनपुट को खाली करना -वास्तव में एक अच्छा विचार नहीं है।
निकाल लें

9
@extempl उपयोगकर्ता के लिए एक उचित सजा की तरह लगता है एक क्षेत्र में एक नकारात्मक में प्रवेश करने की कोशिश कर रहा है जहां सामान्य ज्ञान इंगित करता है कि कोई नकारात्मक नहीं हैं।
खोपी

3
<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">- यह सभी गैर-अंकों के प्रतीकों को हटा देगा
ओलेह मेलनीक

@ रेक्सफ़ोर्ड मैं सहमत हूँ, लेकिन मैंने सेट किया है min="0"इसलिए कोई नगेटिव नहीं हैं। यदि आप ऋणात्मक मान चाहते हैं तो इस विशेषता को हटा दें।
चिन्मय २३५

1
मैंने यह कोशिश की लेकिन यह दशमलव अंकों के साथ संख्याओं को दर्ज होने से रोकता है।
klent

21

आसान विधि:

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


अच्छा और आसान ... लेकिन फिर भी, नकारात्मक संख्याओं को चिपकाया जा सकता है।
राल्फ

10

मैं दशमलव संख्याओं की अनुमति देना चाहता था और यदि नकारात्मक इनपुट किया गया था तो पूरे इनपुट को साफ़ नहीं करना चाहिए। यह क्रोम में कम से कम काम करता है:

<input type="number" min="0" onkeypress="return event.charCode != 45">

यहां अधिक एएससीआई नंबर कैसे जोड़ सकते हैं। उदाहरण के लिए। 45 के साथ मैं भी 46 जोड़ना चाहते हैं। यह कैसे किया जा सकता है?
प्रदीप सिंह

3
@PradeepSingh "वापसी [45, 46] .indexOf (event.charCode) == -1"
ykay का कहना है कि मोनिका

प्लीज आउट ऑफ द बॉक्स। क्या तुम सच में यकीन है कि एक keypressही एक इनपुट में एक नकारात्मक संख्या में प्रवेश कर सकता है एक ही रास्ता है ...
रोको सी। Buljan

6

@ मैनवाल उत्तर अच्छा है, लेकिन मुझे बेहतर पठनीयता के लिए कोड की कम लाइनों वाला कोड पसंद है। इसके बजाय मैं html में onclick / onkeypress उपयोग का उपयोग करना पसंद करता हूं।

मेरा सुझाव दिया समाधान भी यही करता है: जोड़ें

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));
}

एक जावास्क्रिप्ट फ़ंक्शन के रूप में।

जैसा कहा गया, वैसा ही करता है। यह समस्या को हल करने के तरीके पर सिर्फ व्यक्तिगत प्राथमिकता है।


5

केवल संदर्भ के लिए: jQuery के साथ आप निम्न कोड के साथ फ़ोकआउट पर नकारात्मक मानों को अधिलेखित कर सकते हैं:

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

यह सर्वर साइड सत्यापन को प्रतिस्थापित नहीं करता है!


यह ठीक काम करता है यदि उपयोगकर्ता इनपुट क्षेत्र से बाहर केंद्रित करता है , हालांकि यदि वे तुरंत फ़ील्ड में अभी भी दर्ज करते हैं तो प्रेस करते हैं; वे अभी भी एक नकारात्मक संख्या दर्ज कर सकते हैं।
नेमायनेशन

3

यहाँ एक कोणीय 2 समाधान है:

केवल एक कक्षा बनाएँ

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();
    }
  }
}

App.module.ts में घोषणाओं में केवल OneNumber जोड़ें और अपने ऐप में कहीं भी इस तरह का उपयोग करें

<input OnlyNumber="true">

क्या इसके लिए पेस्ट की अनुमति देने का एक तरीका है? इसके अलावा, मैंने regex को भी बदल दिया: / / _-?0-9des+(\..I0-9acing*))0,1arios$/g नकारात्मक संख्याओं की अनुमति देने के लिए, लेकिन यह काम नहीं करता है?
डेव कॉटेज

2
oninput="this.value=(this.value   < Number(this.min) || this.value   > Number(this.max))  ? '' : this.value;"

2
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
सुधेश सिंगानमल्ला

हालांकि यह सही उत्तर हो सकता है, लेकिन इसमें पर्याप्त विवरण का अभाव है। कृपया बताएं कि यह क्यों काम करता है। स्टैक ओवरफ्लो का उपयोग करते समय, विचार करें कि यह एक जीवित ज्ञान का आधार है , उत्तर जो ज्ञान को साझा नहीं करते हैं वे बहुत कम उपयोगी हैं।
मार्क लाफलेर

2

बस ऐसा करने का एक और तरीका जोड़ना (कोणीय का उपयोग करना)यदि आप HTML को और अधिक कोड के साथ नहीं धोना चाहते हैं, तो :

आपको केवल फ़ील्ड वैल्यू सब्सक्राइब करना होगा और वैल्यू को एक निरपेक्ष मान के रूप में सेट करना होगा (किसी नए ईवेंट को न छोड़ने का ध्यान रखना क्योंकि इससे एक और वैल्यू चेंज हो जाएगा, इसलिए एक रिकर्सिव कॉल और एक अधिकतम कॉल आकार को ट्रिगर कर दिया गया है)

HTML कोड

<form [formGroup]="myForm">
    <input type="number" formControlName="myInput"/>
</form>

टाइपस्क्रिप्ट CODE (आपके घटक के अंदर)

formGroup: FormGroup;

ngOnInit() { 
    this.myInput.valueChanges 
    .subscribe(() => {
        this.myInput.setValue(Math.abs(this.myInput.value), {emitEvent: false});
    });
}

get myInput(): AbstractControl {
    return this.myForm.controls['myInput'];
}

1

<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">


1

इसका उत्तर सहायक नहीं है। जब आप अप / डाउन कीज का उपयोग करते हैं तो यह केवल काम करता है, लेकिन यदि आप -11 टाइप करते हैं तो यह काम नहीं करेगा। तो यहाँ एक छोटा सा फिक्स है जो मैं उपयोग करता हूं

पूर्णांकों के लिए यह एक है

  $(".integer").live("keypress keyup", function (event) {
    //    console.log('int = '+$(this).val());
    $(this).val($(this).val().replace(/[^\d].+/, ""));
    if (event.which != 8 && (event.which < 48 || event.which > 57))
    {
        event.preventDefault();
    }
   });

यह एक जब आपके पास मूल्य की संख्या होती है

        $(".numeric, .price").live("keypress keyup", function (event) {
     //    console.log('numeric = '+$(this).val());
    $(this).val($(this).val().replace(/[^0-9\,\.]/g, ''));

    if (event.which != 8 && (event.which != 44 || $(this).val().indexOf(',') != -1) && (event.which < 48 || event.which > 57)) {
        event.preventDefault();
    }
   });

0

यह समाधान कीबोर्ड के साथ कॉपी पेस्ट सहित सभी कीबोर्ड कार्यक्षमता की अनुमति देता है। यह माउस के साथ ऋणात्मक संख्याओं को चिपकाने से रोकता है। यह सभी ब्राउज़रों और कोडपेन पर डेमो के साथ काम करता है बूटस्ट्रैप और jQuery का उपयोग करता है। यह गैर अंग्रेजी भाषा सेटिंग्स और कीबोर्ड के साथ काम करना चाहिए। यदि ब्राउज़र पेस्ट इवेंट कैप्चर (IE) का समर्थन नहीं करता है, तो यह फ़ोकस आउट के बाद नकारात्मक चिह्न को हटा देगा। यह समाधान मूल ब्राउज़र के रूप में व्यवहार करता है जिसे मिन = 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>

जावास्क्रिप्ट

$(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;
    }
  });
});

0

यहाँ एक समाधान है जो मुझे एक क्यूटीवाई क्षेत्र के लिए सबसे अच्छा काम करता है जो केवल संख्या की अनुमति देता है।

// 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;
    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.