有没有比我拥有的输入值乘以更好的方法?

时间:2019-06-27 16:57:16

标签: php jquery addition multiplying

我正在尝试将输入值相加或相乘,以得出两个总数,这在没有尝试使用for循环的情况下是有效的。我的意图是使选择器与每个字符串末尾的i的各种迭代匹配。我在这里有一个小提琴的例子:https://jsfiddle.net/shiataz12/Lo1yek2g/69/

在尝试为每次迭代手动输入名称的同时,我尝试复制并粘贴该函数,但是,如果单击该复选框,仅前两个复选框和后两个复选框会做任何事情,但效果不佳。

HTML:

<--- HTML SECTION --->>
// obtained from $nosday = $_POST['nosday'];
<br>
// value is normally $nosday
<br>
<input type="text" value="5" id="nosday"><br><br>
 // obtained from $count = mysqli_num_rows($result);
 <br>
 // value is normally $count;
 <br>
<input type="text" value="2" id="countrows"><br><br>
<label for="checkbox1">Standard</label>
<<----Assume checkbox --> id --> is $qri and $qri = "qr"."$i";
<input type="checkbox" name="checkbox1" class="quip" value="125" id="qr1" checked><br><br>
<label for="checkbox1">Equipped</label>
<input type="checkbox" name="checkbox1" class="quip" value="225" id="qr1"><br><br>
<label for="checkbox3">GPS</label>
<input type="checkbox" name="checkbox3" value="20" id="qr1"><br><br>
<label for="checkbox4">booster</label>
<input type="checkbox" name="checkbox4" value="20" id="qr1"><br><br>
<label for="checkbox5">One tent</label>
<input type="checkbox" name="checkbox5" class="tents" value="60" id="qr1" checked><br><br>
<label for="checkbox6">Two tents :</label>
<input type="checkbox" name="checkbox6" class="tents" value="80" id="qr1"><br><br>
// assume id="#dailytotal" where dailytotal = "dailytotal"."$i";
<br>
Daily :<span id="dailytotal1"> </span><br><br>

// Assume id = "$lengthtotal" where $lengthtotal = "lengthtotal"."$i";
<br>
Total :<span id="lengthtotal1"> </span><br><br>
// Hidden element for daily rate to use in $_POST, shown for now
<br>
<input tyep="text" id="dailytot1" name="pricef1" value="">
<br>
// Hidden element for length rate to use in $_POST, shown for now
<input tyep="text" id="lengthtot" name="pricef2" value="">
<input type="text" value="2" id="countrows"><br><br>
<label for="checkbox1">Standard</label>
<input type="checkbox" name="checkbox1" class="quip" value="125" id="qr2" checked><br><br>
<label for="checkbox1">Equipped</label>
<input type="checkbox" name="checkbox1" class="quip" value="225" id="qr2"><br><br>
<label for="checkbox3">GPS</label>
<input type="checkbox" name="checkbox3" value="20" id="qr2"><br><br>
<label for="checkbox4">booster</label>
<input type="checkbox" name="checkbox4" value="20" id="qr2"><br><br>
<label for="checkbox5">One tent</label>
<input type="checkbox" name="checkbox5" class="tents" value="60" id="qr2" checked><br><br>
<label for="checkbox6">Two tents :</label>
<input type="checkbox" name="checkbox6" class="tents" value="80" id="qr2"><br><br>
Daily :<span id="dailytotal2"> </span><br><br>
Total :<span id="lengthtotal2"> </span><br><br>
// Hidden element for daily rate to use in $_POST, shown for now
<br>
<input tyep="text" id="dailytot2" name="pricef1" value="">
<br>
// Hidden element for length rate to use in $_POST, shown for now
<input tyep="text" id="lengthtot2" name="pricef2" value="">

$(function() {
  $("input.quip").change(function() {
    $("input.quip").not(this).prop("checked", false);
  });
    $("input.tent").change(function() {
    $("input.tent").not(this).prop("checked", false);
  });
  $(function() {
    //get the values of the selected options
      var counter = ("#countrows").val();
            var i = 0;
      for (i = 1; i <= counter; i++){
    let v = $.map($('#qr' + i).is("checked"), function(i) {
      return parseFloat($(i).val());
    });

    let s = v.reduce((a, b) => a + b); //sum them up to a daily total
    console.log(v);
    $('#dailytotal' + i).text('R' + s + '/day');
    $('#lengthtotal' + i).text('R' + s * parseFloat($("#nosday").val()) + '/day');
    $('#dailytot' + i).val(s);
    $('#lengthtot' + i).val(s * parseFloat($("#nosday").val()));
      }
      });
});     

所提供的示例假定数据库有两行,因此i = 2,因此qr2的id应该更改为i=2。我希望通过将行数作为在Jquery中使用for的基础来工作,将行数限制为使每个节可以独立执行,但是它们继续对函数进行反应并且不显示任何值

我想也许我现在就可以使用单个ID来复制/粘贴代码,这将使我有时间来研究更好的解决方案,但是它并没有达到我的预期。与map一起使用,最好先声明一个数组,我是否可以在输入中使用与数组相同的ID?尽管我猜我可以使用名称选择器,但它使计算更容易。

希望有人可以引导我找到正确的答案,这把我逼到了墙。

1 个答案:

答案 0 :(得分:0)

将其稍微修剪一下。还有其他问题。假定“标签为”是指被标记元素的id。 “标准”和“配备”选项实际上是单选按钮,而不是复选框,因为可能您可以选择其中一个。我重命名了一些类和ID,尽管您可能不需要所有这些。我假设您可能是在动态生成HTML,并仅将“ i”的值添加为后缀,具体取决于您拥有多少行。实际上,我只是对第一行进行了更改,并重新编写了JS,以便为您提供该行的输入元素中的值构成的项目的总计。不确定确切如何计算这些总数,因为$(“#multiplier”)我什至不在您的代码中。您将不得不仔细研究一下,然后看看自己想要什么,但是总的来说看起来很正常。

<--- HTML SECTION --->>
// obtained from $nosday = $_POST['nosday'];
<br>
// value is normally $nosday
<br>
<input type="hidden" value = "1.5" id = "multiplier">
<input type="text" value="5" id="nosday"><br><br>
 // obtained from $count = mysqli_num_rows($result);
 <br>
 // value is normally $count;
 <br>
<input type="hidden" value="2" id="countrows"><br><br>
// Assume checkbox  is $qri and $qri = "qr"."$i";<br>

<label for="standard1">Standard</label>
<input type="radio" name="equipment" id ="standard1" class="quip qr1" value="125" checked><br><br>

<label for="equipped1">Equipped</label>
<input type="radio" name="equipment" id ="equipped1" class="quip qr1" value="225" ><br><br>

<label for="gps1">GPS</label>
<input type="checkbox" name="gps" id ="gps1" value="20" class ="qr1"><br><br>

<label for="booster1">booster</label>
<input type="checkbox" name="booster" id ="booster1" value="20" class ="qr1"><br><br>

<label for="tents1">One tent</label>
<input type="checkbox" name="tents" id ="tents1" class="tents qr1" value="60" checked><br><br>

<label for="twotents1">Two tents :</label>
<input type="checkbox" name="twotents" id ="twotents1" class="tent qr1" value="80"><br><br>

// assume id="#dailytotal" where dailytotal = "dailytotal"."$i";
<br>
Daily :<span id="dailytotal1"> </span><br><br>

// Assume id = "$lengthtotal" where $lengthtotal = "lengthtotal"."$i";
<br>
Total :<span id="lengthtotal1"> </span><br><br>
// Hidden element for daily rate to use in $_POST, shown for now
<br>
<input tyep="text" id="dailytot1" name="pricef1" value="">
<br>

由于我不知道您如何生成HTML,因此可能需要调整JS。照原样,它应该计算加载时所有“ i”行的总数,并且添加一些内容来计算“ ith”行的总数并不难。那应该给你一些帮助。

function Calc() {
    //get the values of the selected options
      var counter = $("#countrows").val();
      let totals = [];
            for (i = 1; i <= counter; i++) {
      totals[i] = 0;
      $.each($('.qr' + i + ':checked'), function() {
        totals[i] += parseInt($(this).val());
      });
      console.log(totals[i]);
    $('#dailytotal' + i).text('R' + totals[i] + '/day');
    $('#lengthtotal' + i).text('R' + totals[i] * parseFloat($("#multiplier").val()) + '/day');
    $('#dailytot' + i).val(totals[i]);
    $('#lengthtot' + i).val(totals[i] * parseFloat($("#multiplier").val()));

      }

}    

Calc();

$("[class*=qr]").on("change", function(e) {
e.preventDefault();
Calc();

});

“ [class * = qr]”并不是最好的,因为* = qr并不是那么具体,具体取决于您的标记。另外,也不清楚您是否也在任何地方使用表单标签。