如何在ajax update div中进行计算?

How can do calculations in ajax update div?

提问人:Carlos Morales 提问时间:6/4/2014 更新时间:6/4/2014 访问量:735

问:

我做了一个使用 javascript 将数量乘以价格的应用程序,但仅适用于第一行。

这是控制器:

def index
   @products= CustomerProduct.all
end 

def selected_product
   @selected_product = CustomerProduct.find(params[:id])
end

以下是索引视图:(显示所有产品和将要更新的 div)

<% @products.each do |product| %>
 <p> 
    <%= product.product_name %>
    <%= link_to_remote image_tag("image.png"),:url=>{:controller=>"customer_product",:action=>"selected_product",:id=>product.id } %>
 </p>
<% end %>

<div id="list_products">
   ## Here is the div that will update after select a product.
</div> 

这是将替换 div 的 ajax 更新:“selected_product.rjs”

 page.insert_html(:bottom,"list_products", :partial=>"customer_product/partials/add_product")

下面是 add_product.erb 的部分视图,显示了所选的信息

<script type="text/javascript">
jQuery("#quantity").live("change", function(){
    quantity = parseFloat(jQuery(this).val() );
    importe = parseInt(jQuery("#importe").val());

    total2 = quantity*importe;   
    jQuery("#total2").val(total2.toFixed(2));
    jQuery("#total2").autoNumericSet(total2.toFixed(2));

  });
jQuery('input#total2').autoNumeric();
</script>

<% @products.each do |product| %>
 <p>
    <%= text_field_tag 'code',@selected_product.product_code,:maxlength=>"10",:size=>"10" if @selected_product %>
    <%= text_field_tag 'name',@selected_product.product_name,:size=>"40" if @selected_product %></td>
    <%= text_field_tag 'quantity',@net_insurance.to_i ,:value=>"1" ,:maxlength=>"9",:size=>"8" if @selected_product%>
    <%= text_field_tag 'importe',@selected_product.product_price ,:readonly=>true,:size=>"10" if @selected_product %>
    <%= text_field_tag 'total2',@total2.to_i,:maxlength=>"12",:size=>"12" if @selected_product %>
 </p>
<% end %>

仅在第一行工作时工作正常

enter image description here

但是添加更多行后不起作用

enter image description here

似乎javascript只适用于第一行。

请有人可以帮我解决这个问题吗?

javascript jquery ajax ruby-on-rails-2

评论


答:

5赞 jupenur 6/4/2014 #1

这里的问题是您正在使用 ID 访问字段。每个产品行上的 ID 都相同。对于有效的 HTML,每个元素的 ID 必须是唯一的,这就是 jQuery 选择器只选取第一行的原因。

若要解决此问题,请为每一行生成唯一的 ID,或使用 ID 以外的其他 ID。例如,类。

下面是用于类的更改处理程序的修改版本:

jQuery(".quantity").live("change", function() {

    // find the parent <p> element of the quantity field
    var row = jQuery(this).parent();

    // retrieve the values from the fields in row
    quantity = parseFloat(jQuery(this).val());
    importe = parseInt(row.find(".importe").val());

    // do the calculation
    total2 = quantity * importe;

    // set the value to to the total2 field in row
    row.find(".total2").val(total2.toFixed(2));
    row.find(".total2").autoNumericSet(total2.toFixed(2));
});

评论

0赞 jupenur 6/4/2014
是的,您必须进行一些更改。具体是什么,这取决于你选择哪种方法。如果您使用 CSS 类,则不必继续向脚本添加新 ID。
0赞 jupenur 6/4/2014
我从未使用过 eRuby,所以我无法帮助您完成这部分,但我在我的答案中添加了一些示例 JavaScript 代码。
0赞 jupenur 6/4/2014
您是否遇到某种错误?您使用的是哪个版本的 jQuery?
0赞 jupenur 6/4/2014
听起来很奇怪。我在 jsfiddle 中测试了代码,所以它应该可以工作。尝试添加一些日志记录,看看是否可以查明问题所在。
0赞 jupenur 6/4/2014
是的,我明白你想达到什么目的。我给你的代码应该完全做到这一点,只要 RoR 逻辑是有效的。