javascript - Jquery 计数不正确?

标签 javascript jquery html

我想预订一张免费机票,规则如下:

  • 一个人可以购买 1 张或多张门票,但最多 4 张
  • 他可以提出最低 1 欧元的门票报价,但没有限制。因此,如果他购买 4 张票,报价至少为 4 欧元。

检查 (validate()) 发生在页面加载后以及每个 changekeyup 事件上。当我将购买门票从 1 增加到 2 时,一切似乎都正常,报价从 1 增加到 2,正如预期的那样。

我的问题:
当我将“ticket”(第一个输入)保留为 2 并增加报价时,它不会超过 9,在 10 时,它将输入值设置回与ticket 输入中相同的值。

另外,如果我按住向上箭头将数字增加到 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">

关于javascript - Jquery 计数不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60419140/

相关文章:

javascript - 使用 Lodash 或 Underscore 按多列对对象进行分组

html - 当另一个元素改变大小时如何避免html页面中的元素移动

php - 无法使用 jquery mobile 在新选项卡中打开链接

html - 在带有 <base> 标签的链接上使用空 href 是否可以

JavaScript。单击链接时循环

javascript - 循环遍历 jQuery Then When 的 Ajax 请求的两种方法 - 使用哪个?

javascript - 如何获取选项选定的数据标签

javascript - 在 HTML5 Canvas 上绘制多个圆的问题

jquery - 表格即将超出 div

jQuery - 重置变量