javascript - Jquery 计数不正确?
问题描述
我想预订一张免费优惠的机票,这些是规则:
- 一人可购买1张或多张门票,但限购4张
- 他可以为门票提供 1 欧元的最低报价,但没有限制。因此,如果他购买 4 张门票,报价将至少为 4 欧元。
检查 ( validate()
) 发生在页面加载后和每个change
或keyup
事件上。当我将购买的门票从 1 增加到 2 时,一切似乎都很好,报价从 1 增加到 2,正如预期的那样。
我的问题:
当我将“票”(第一次输入)留在 2 并增加报价时,它不超过 9,在 10 时它将输入值设置回与票输入中的相同值。
另外,例如,如果我按住箭头以将数字增加到 50,那就可以了。
怎么了?
我的代码是:
validate();
$('.input_data').on('change keyup', validate);
function validate() {
control_tick = $("input[name='ticket']").val();
if ((control_tick < 1) || (control_tick > 4)) {
control_tick = 1;
$("input[name='ticket']").val(control_tick);
} else {
$("input[name='ticket']").val(control_tick);
}
control_off = $("input[name='offer']").val();
if (control_tick > control_off) {
control_off = control_tick;
$("input[name='offer']").val(control_off);
console.log('prezzo minore di ticket');
}
if (control_off => control_tick) {
$("input[name='offer']").val(control_off);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label>Ticket number (max 4):</label><br>
<input class="w3-input w3-center input_data" type="number" name="ticket" value="1" min="1" max="4" step="1">
<label>Offer €:</label>
<input class="w3-input w3-center input_data" type="number" name="offer" value="1" min="1" max="1000" step="1">
解决方案
原因
当您使用 获取字段的值时.val()
,该值始终为 类型string
。因此,当您使用 比较值时if (control_tick > control_off) {
,您是在比较两个字符串,而不是两个数字。而在字符串比较的规则中,"2"
被认为是“大于” "10"
,因为它一次比较每个字符,而不是整个字符串,显然它认为“2”大于“1”。
(关于将向上箭头保持到 50,这将是可以的,因为"50"
(或者更确切地说,在字符串比较"5"
中大于"2"
,就像在数字比较中一样。但如果你一直保持到 100,它会再次重置 - 我'相信你现在可以找出原因。)
解决方案
在尝试比较它们之前,您需要将值解析为数字。由于这些总是整数,我们可以使用parseInt。这将确保它进行数字比较。
有关工作示例,请参见下面的演示。
(另请注意,删除了最后一条if
语句 - 除了轻微的语法错误(=>
应该是>=
,虽然它不会导致语法错误,因为它是有效的,(但无用)作为箭头表达式)它似乎是多余的,因为你只是使用您之前从它获得的相同值填充该字段。出于同样的原因else
,第一个之后的if
也是多余的。)
validate();
$('.input_data').on('change keyup', validate);
function validate() {
control_tick = parseInt($("input[name='ticket']").val());
if ((control_tick < 1) || (control_tick > 4)) {
control_tick = 1;
$("input[name='ticket']").val(control_tick);
}
control_off = parseInt($("input[name='offer']").val());
if (control_tick > control_off) {
control_off = control_tick;
$("input[name='offer']").val(control_off);
console.log('prezzo minore di ticket');
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label>Ticket number (max 4):</label><br>
<input class="w3-input w3-center input_data" type="number" name="ticket" value="1" min="1" max="4" step="1">
<label>Offer €:</label>
<input class="w3-input w3-center input_data" type="number" name="offer" value="1" min="1" max="1000" step="1">
推荐阅读
- java - 移入列的算法:移动字母不起作用
- c# - 自定义 Slack 命令返回状态 200 并触发另一个作业
- mysql - Postfix 与 PostfixAdmin 和 MySQL 后端表查找/权限被拒绝错误
- sql - 在 30 秒内加入时间戳?
- javascript - 为什么 Swift 不能识别 JS 发送的数组?
- mysql - 从查询中只选择一列:“SHOW TABLE STATUS FROM `DB`”?
- php - 不存在的类:codeigniter 中的 CI_ApiClient 错误
- c# - 在自定义方法中为数组中的元素分配最小值 (array.Min())
- android - viewmodel Android中的动态参数
- typescript - TypeScript isolatedModules 真正的导出生成器功能