【问题标题】:Calculate each row table from foreach using jquery使用jquery从foreach计算每一行表
【发布时间】:2019-01-05 04:40:11
【问题描述】:

我在 Table 中有 foreach 循环(rails),我想从一个输入文本计算每一行。

我已经尝试创建 jquery,但它只计算表的第一行。

对此的预期输出是,它必须看到从输入文本 keyup 计算的每一行

 <input type = "text" class = "share_amount" id = "alldata" >
 <table class="table table-borderless table-striped table-earning">
 <thead>
 <tr>
    <th>User</th>
    <th>Amount</th>
    <th>Share</th>
    <th>Result</th>
 </tr>
</thead> 
<tbody>                                   
<% @userfile.each do |info|%>
<tr class = "itemrow">
  <td><%= info.name %></td>
  <td class = "price1"><%= info.amount %></td>
  <td><%= info.share %></td>
  <td class = "result"></td>
</tr>
<%end%>

  <script>
        $(document).ready(function(){
            $("input#alldata").keyup(function() {
                var share = this.value;
                $('tr.itemrow').each(function () {
                   $(this).find('.price1').each(function(){
                      var tdval = $(this).text();
                      $(".result").text(share * tdval);
                 });     
              });
            });
          });
    </script>

【问题讨论】:

  • 认为你有太多的.each() 在运行。您在行中寻找“price1”,是否有超过 1 个?看起来不是那样,所以我不会在上面使用.each()

标签: jquery ruby-on-rails ruby


【解决方案1】:

使用.each() 时,请确保不要过度使用。此外,对于这种用法,传入索引和元素或使用this 会很有帮助。

考虑以下示例:

$(function() {
  $("input#alldata").keyup(function(e) {
    var share = parseFloat($(this).val());
    $('tr.itemrow').each(function(i, el) {
      var val = share * parseFloat($(".price1", el).html());
      $(".result", el).html(val.toFixed(2));
    });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" class="share_amount" id="alldata">
<table class="table table-borderless table-striped table-earning">
  <thead>
    <tr>
      <th>User</th>
      <th>Amount</th>
      <th>Share</th>
      <th>Result</th>
    </tr>
  </thead>
  <tbody>
    <tr class="itemrow">
      <td>
        Name 1
      </td>
      <td class="price1">
        1.50
      </td>
      <td>
        Share 1
      </td>
      <td class="result"></td>
    </tr>
    <tr class="itemrow">
      <td>
        Name 2
      </td>
      <td class="price1">
        2.75
      </td>
      <td>
        Share 2
      </td>
      <td class="result"></td>
    </tr>
    <tr class="itemrow">
      <td>
        Name 3
      </td>
      <td class="price1">
        4.00
      </td>
      <td>
        Share 3
      </td>
      <td class="result"></td>
    </tr>
  </tbody>
</table>

文本字段的值将是字符串类型。目前尚不清楚用户是要输入整数还是浮点值,但由于我们正在使用价格,我认为它可能是。我使用parseFloat() 将输入的值转换为浮点数。

.each()lookp 中,我可以使用$("select", element)style selection. Similar to$(element).find()` 只选择特定的类项。没有真正的区别,在我看来只是更少的代码。

从表格中读取价格并将其转换为另一个浮点值。计算所需值并将其放入该行的结果列中。我使用.toFixed() 来帮助四舍五入或显示浮点值(如果是货币)。

希望这会有所帮助。

【讨论】:

  • 这是我正在寻找的结果,非常感谢。你拯救了我的一天。我很困惑 jquery .each 。非常感谢
【解决方案2】:

以下几点会对您有所帮助,

  1. 您的每一行表格都具有相同的类,这对您的目标来说是真正的问题。所以为表格的每一行定义不同的类。

  2. classJS 中的搜索速度较慢,因此请使用id 代替它。

以下可以为每一行提供单独的id索引。

<% @userfile.each_with_index do |info, i|%>
  <tr id = "itemrow-#{i+1}">
    <td><%= info.name %></td>
    <td id = "price-#{i+1}"><%= info.amount %></td>
  1. 稍后按照doc在您的js代码中使用$("[id^='itemrow']")$("[id^='price']")

  2. 补充:如果你的实例@userfile是集合对象,那么它应该是复数。使其适合@userfiles

  3. 休息是你努力的一部分。

【讨论】:

  • 我想我错过了这个。让我检查并回复你。谢谢
  • @ray 使用类仍然有助于选择大型分组和样式。这并不是说 ID 不好,但可能不是这个用例的最佳选择。
  • @Twisty 我一定会记下它以进一步检查它,因为我在 JS 中没有好的 exp。也许任何澄清它的参考都会被应用:)
  • @ray 我会看看能不能找到一个好的参考。这实际上只是您想要做什么的问题。按 ID 选择可以很好地选择一个独特的项目。但是如果你需要抓取一组元素,属性或类的选择会有所帮助。
【解决方案3】:

在 html 中给出“jquery/min.js”的路径,然后执行 keyup 事件 //html

<script 
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"> 
</script>    
<input type = "text" class = "share_amount" id = "alldata" >
<table class="table table-borderless table-striped table-earning">
<thead>
 <tr>
  <th>User</th>
  <th>Amount</th>
  <th>Share</th>
  <th>Result</th>
 </tr>
</thead> 
<tbody>                                   
  <tr class="itemrow">
    <td>ABC</td>
    <td class="price1">10000</td>
    <td>Share1</td>
    <td class="result"></td>
  </tr>
  <tr class="itemrow">
    <td>ABC2</td>
    <td class="price1">20000</td>
    <td>Share2</td>
    <td class="result"></td>
  </tr>
</tbody>

//jquery

$("#alldata").keyup(function() {
var share = this.value;
 $('tr.itemrow').each(function () {
  $(this).find('.price1').each(function(){
   var tdval = $(this).text();
   $(".result").text(share * tdval);
  });     
 });
});

【讨论】:

  • 发布答案时,通常最好向 OP 或找到此帖子的其他用户解释或提供一些额外信息。
【解决方案4】:

您还没有指定哪个.result 是指使用$(".result").text(share * tdval); 的情况,我建议他进行更改以访问同一行中所需的.result

<script>
//....
     $('tr.itemrow').each(function () {

           $(this).find('.price1').each(function(){
               var tdval = parseInt($(this).text()); //use parseInt to convert it to a number
           });

          $(this).find(".result").text(share * tdval);
    })
//...
</script>

最后我认为没有必要循环价格,因为每一行只有一个价格。

【讨论】:

  • 可能很难用字符串做数学运算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2011-05-03
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多