简体   繁体   English

如何禁止输入中的字符

[英]How to forbid characters in input

I have a calculator that get values from inputs and then performs some calculations. 我有一个计算器,可以从输入中获取值,然后执行一些计算。 Each input is a type="number" field. 每个输入都是一个type="number"字段。 Everything works fine, but if you use . 一切正常,但是如果您使用. or - then the calculator works incorrectly. -计算器工作不正常。 I see an empty value in console, but it works fine with , . 我看到控制台为空值,但它工作正常, I added pattern="\\d+(,\\d{2})?" 我添加了pattern="\\d+(,\\d{2})?" , but maybe I did something wrong, but this didn't help? ,但也许我做错了什么,但这没有帮助吗?

I need to forbid input . 我需要禁止输入. and - , and it would be great if someone explain how to cut value to two characters after , to make it look like the price. -它会如果有人解释如何切后价值为两个字符是巨大的,以使它看起来像的价格。

Thank you 谢谢

Here is my example: 这是我的示例:

 $('.calculator-button').on('click', function() { var calculator = { priceGbo: $('#price_gbo').val(), priceFuel: $('#price_fuel').val(), priceGas: $('#price_gas').val(), priceMile: $('#expenses_mile').val(), priceDay: $('#expenses_day').val() }; var everydayEconomy = calculator.priceDay * (calculator.priceMile / 100) * (calculator.priceFuel - calculator.priceGas * 1.1); var fiveYears = everydayEconomy * 1825; var feedbackTime = calculator.priceGbo / everydayEconomy; $('#everyday_economy').text(everydayEconomy.toFixed(0)); $('#fiveYears_economy').text(fiveYears.toFixed(0)); $('#feedback_time').text(feedbackTime.toFixed(0)); }); 
 .call-modal { width: 380px; height: 48px; background: #ffc107; color: black; font-size: 18px; font-family: "Pt Sans Bold"; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; cursor: pointer; margin: 0.667em 0; } /** Added to reduce clutter. */ .calculator-inputs-left-row__text, .calculator-results-item__text { display: inline-block; width: 13em; font-weight: bold; } .calculator-inputs-left-row__text:after, .calculator-results-item__text:after { content : ': '; } .calculator-inputs-left-row__input, .calculator-results-item__result { display: inline-block; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="calculator-inputs-left"> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Price GBO ($)</div> <div class="calculator-inputs-left-row__input"> <input type="number" pattern="\\d+(,\\d{2})?" class="calculator-input" id="price_gbo" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Price fuel ($)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="price_fuel" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Price gas ($)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="price_gas" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Consumption on 100 km (l)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="expenses_mile" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Average daily mileage (km)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="expenses_day" min="0" value=""> </div> </div> </div> <div class="call-modal calculator-button">Get result</div> <div class="calculator-line"></div> <div class="calculator-results"> <div class="calculator-results-item"> <div class="calculator-results-item__text">Daily savings ($)</div> <div class="calculator-results-item__result"> <span id="everyday_economy"></span> </div> </div> <div class="calculator-results-item"> <div class="calculator-results-item__text">For 5 years of operation ($)</div> <div class="calculator-results-item__result"> <span id="fiveYears_economy"></span> </div> </div> <div class="calculator-results-item"> <div class="calculator-results-item__text">Payback period (days)</div> <div class="calculator-results-item__result"> <span id="feedback_time"></span> </div> </div> </div> 

You might want to parse the input using parseFloat : 您可能想使用parseFloat解析输入:

var calculator = {
  priceGbo: parseFloat($('#price_gbo').val()),

a calculation like "12"*"5.0" will work in Javascript and yield 60 , while "12"*"5,0" will return NaN . "12"*"5.0"这样的计算将在Javascript中工作并产生60 ,而"12"*"5,0"将返回NaN

Parsing the strings as floating point numbers fixes things: 将字符串解析为浮点数可解决问题:

parseFloat("12")*parseFloat("5,0") == 60 // true

To actually answer the question: 实际回答问题:

<input type="number" pattern="^(?:\d|[^.e-])+$"/>

input validation will only work if you use a <form onSubmit="javascript:doCalculation()"> element with an <input type="submit"/> button. 仅当您使用带有<input type="submit"/>按钮的<form onSubmit="javascript:doCalculation()">元素时,输入验证才有效。 Your onSubmit handler would only be called when validation is successful. 仅当验证成功时,才会调用onSubmit处理程序。

An onClick handler of some button will always be able to read the current value without any validation. 某些按钮的onClick处理程序将始终能够读取当前值而无需任何验证。

https://www.w3schools.com/tags/att_input_pattern.asp https://www.w3schools.com/tags/att_input_pattern.asp

https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_pattern https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_pattern

Characters such as , are not allowed inside the number field. 字符,例如,没有数场允许入内。 Please review the specs for the W3C floating-point number datatype. 请查看W3C浮点数数据类型的规范


You need to do a couple things: 您需要做几件事:

  1. Wrap your inputs in a form to utilize native submit validation 将您的输入包装成表格以利用本机提交验证
  2. Make the form return false on submission so that it does not navigate from the page. 使表单在提交时返回false,这样它就不会从页面导航。
  3. Change all your inputs to a text field with a pattern. 将所有输入更改为带有模式的文本字段。 I added that logic at the very top. 我在最顶部添加了该逻辑。
  4. Use a parser function to normalize all the numbers into proper floating-point numbers. 使用解析器功能将所有数字标准化为适当的浮点数。

The example below shows all of this in action. 下面的示例显示了所有这些操作。

 // Change number fields to text with number validation. // See: https://stackoverflow.com/questions/13412204/localization-of-input-type-number $('.calculator-input').each(function() { $(this).attr('type', 'text').attr('pattern', '\\\\d+(,\\\\d{2})?'); }); $('.calculator-button').on('click', function() { var calculator = { priceGbo: currencyParser($('#price_gbo').val()), priceFuel: currencyParser($('#price_fuel').val()), priceGas: currencyParser($('#price_gas').val()), priceMile: currencyParser($('#expenses_mile').val()), priceDay: currencyParser($('#expenses_day').val()) }; var everydayEconomy = calculator.priceDay * (calculator.priceMile / 100) * (calculator.priceFuel - calculator.priceGas * 1.1); var fiveYears = everydayEconomy * 1825; var feedbackTime = calculator.priceGbo / everydayEconomy; $('#everyday_economy').text(everydayEconomy.toFixed(0)); $('#fiveYears_economy').text(fiveYears.toFixed(0)); $('#feedback_time').text(feedbackTime.toFixed(0)); }); // See: https://gist.github.com/leodutra/3057153 function currencyParser(str) { str = (str + '').replace(/[^\\d,.-]/g, ''); var sign = str.charAt(0) === '-' ? '-' : '+'; var minor = str.match(/[.,](\\d+)$/); str = str.replace(/[.,]\\d*$/, '').replace(/\\D/g, ''); return Number(sign + str + (minor ? '.' + minor[1] : '')); } 
 .call-modal { width: 380px; height: 48px; background: #ffc107; color: black; font-size: 18px; font-family: "Pt Sans Bold"; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; cursor: pointer; margin: 0.667em 0; } /** Added to reduce clutter. */ .calculator-inputs-left-row__text, .calculator-results-item__text { display: inline-block; width: 13em; font-weight: bold; } .calculator-inputs-left-row__text:after, .calculator-results-item__text:after { content : ': '; } .calculator-inputs-left-row__input, .calculator-results-item__result { display: inline-block; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form onsubmit="return false"> <div class="calculator-inputs-left"> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Price GBO ($)</div> <div class="calculator-inputs-left-row__input"> <input type="number" pattern="\\d+(,\\d{2})?" class="calculator-input" id="price_gbo" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Price fuel ($)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="price_fuel" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Price gas ($)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="price_gas" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Consumption on 100 km (l)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="expenses_mile" min="0" value=""> </div> </div> <div class="calculator-inputs-left-row"> <div class="calculator-inputs-left-row__text">Average daily mileage (km)</div> <div class="calculator-inputs-left-row__input"> <input type="number" class="calculator-input" id="expenses_day" min="0" value=""> </div> </div> </div> <button type="submit" class="call-modal calculator-button">Get result</button> </form> <div class="calculator-line"></div> <div class="calculator-results"> <div class="calculator-results-item"> <div class="calculator-results-item__text">Daily savings ($)</div> <div class="calculator-results-item__result"> <span id="everyday_economy"></span> </div> </div> <div class="calculator-results-item"> <div class="calculator-results-item__text">For 5 years of operation ($)</div> <div class="calculator-results-item__result"> <span id="fiveYears_economy"></span> </div> </div> <div class="calculator-results-item"> <div class="calculator-results-item__text">Payback period (days)</div> <div class="calculator-results-item__result"> <span id="feedback_time"></span> </div> </div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM