JS:从多个 id 构建值的总和

JS: Build sum of values from multiple id's

我有这个 HTML + JS:

<input type="text" id="first" value="" />
<input type="text" id="second" value="" />
<input type="text" id="third" value="" />

<b id="result"></b>

<script>
$(document).ready(function () {
 var $range = $("#first"), $result = $("#result");

 var track = function () {
  var $this = $(this), value = $this.prop("value");
  $result.html("Value: " + value);
 };

 $range.on("change", track);
});
</script>

这会获取具有 id "first" 的范围滑块的即时值,并立即在元素 "result" 中输出它。工作正常。

但是现在我想输出所有id的"first"、"second"、"third"等的总和

如何在此代码中执行此操作?

使用 .on() 附加事件侦听器三次,正如您对第一次所做的那样。然后,而不是做 $this.prop 你会想要真正抓住每个人。

$(document).ready(function () {
 var $first = $("#first"), $second = $("#second"), $third = $("#third"), $result = $("#result");

 var track = function () {
  var value = $first.prop("value") + $second.prop("value") + $third.prop("value");
  $result.html("Value: " + value);
 };

 $first.on("change", track);
 $second.on("change", track);
 $third.on("change", track);
});

首先,您可能会发现将 CSS class 分配给您想要对其值求和的所有范围字段更容易。这将允许您使用单个选择器在 DOM 中找到它们。

但您需要做的就是找到所有范围元素,遍历它们,边走边求和它们的值。然后将结果分配给你的 div.

$(function () {
    var $range = $('#first, #second, #third');
    var $result = $('#result');

    function track(event) {
        var total = 0;

        $range.each(function (i, element) {
            total += parseInt($(element).val(), 10);
        });

        $result.html('Value: ' + total);
    }

    $range.on('change', track);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input id="first" type="range" min="0" max="10" value="1">
<input id="second" type="range" min="0" max="10" value="2">
<input id="third" type="range" min="0" max="10" value="3">

<div id="result"></div>

我假设您使用的是整数值。如果不是,您将需要使用 parseInt.

删除整数转换

Select所有元素并使用.reduce().

$(document).ready(function() {
  const result = $("#result");

  const range = $("#first,#second,#third")
      .on("change", function() {
         result.html("Value: " + 
            range.toArray().reduce((sum, el) => sum + +el.value, 0));
   });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="first" value="1" />
<input type="text" id="second" value="2" />
<input type="text" id="third" value="3" />

<b id="result"></b>

分配一个公共 class 比按 ID 选择更好,但这取决于您。

我会用 $.fn.extend():

// external.js
$(function(){
$.fn.extend({
  valSum: function(){
    var c = 0;
    this.each(function(){
      c += +$(this).val();
    });
    return c;
  }
});
$('#frm').submit(function(e){
  e.preventDefault();
});
// I would give them all a class instead - but
var sum = $('.sum');
sum.change(function(){
  $('#output').html(sum.valSum());
});
});
/* external.css */
html,body{
  padding:0; margin:0;
}
.main{
  width:940px; padding:20px; margin:0 auto;
}
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
  <head>
    <meta http-equiv='content-type' content='text/html;charset=utf-8' />
    <meta name='viewport' content='width=device-width' />
    <title>.valSum()</title>
    <link type='text/css' rel='stylesheet' href='css/external.css' />
    <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script>
    <script type='text/javascript' src='external.js'></script>
  </head>
  <body>
    <div class='main'>
      <form id='frm' name='frm'>
        <label for='first'>First</label>
        <input id='first' name='first' class='sum' type='text' />
        <label for='second'>Second</label>
        <input id='second' name='second' class='sum' type='text' />
        <label for='third'>Third</label>
        <input id='third' name='third' class='sum' type='text' />
      </form>
      <div id='output'></div>
    </div>
  </body>
</html>

.valSum() 现在应该可以在任何选择器上工作,无论如何都有输入。所以,

var fst = $('#first, #second, #third');
fst.change(function(){
  $('#output').html(fst.valSum());
});

也应该在不添加 HTML class.

的情况下工作

因为这更可重用,所以应该是你编码的方式。