【问题标题】:Javascript: Subtracting items from shopping cart result in negative valueJavascript:从购物车中减去商品会导致负值
【发布时间】:2013-11-20 19:46:34
【问题描述】:

我正在尝试修改这个购物车脚本。麻烦的是,每当我尝试从购物车中删除多个商品时,我都会得到一个负值。删除所有商品后,购物车永远不会归零。我可以很好地添加项目。

Here is the fiddle.

以下是此功能的代码 sn-p。完整的代码在小提琴中,因为通过向您展示我遇到的问题的演示更容易解释。

function addToCart(id, container_id, corTitle, corPrice, credit_hrs) {
    var amount = parseFloat(corPrice);
    var hours = parseFloat(credit_hrs);
    var remove = "<button type=\"button\" class=\"remove\"></button>";
    var selected_product = "<div class=\"item \">"
            + "<div class=\"title\">"
            +"<div class=\"remove\"><button type=\"button\" title=\"remove from cart\" class=\"remove-from-cart\" alt=\"Remove Course\" ></button></div>"               
            + corTitle
            + " for $" + corPrice
            + "</div>"              
            + "<input name=\"containerId\" value=\"" + container_id
            + "\" type=\"hidden\">" + "</div>";
    $(selected_product).insertBefore("#subtotals");

    register("add", amount, hours);
    $(".remove-from-cart").click(function() {

        $(this).parents(".item").slideUp("slow");
        console.log(this);
        register("subtract", amount, hours);
        $(toId(id)).removeAttr("disabled").fadeTo("slow", 1);
        $(this).parents(".item").remove();
    });
}   

问题似乎是在单击删除按钮时多次调用附加到删除按钮的click 处理程序。 register("subtract", amount, hours) 的重复调用导致总数变为负数。我该如何解决这个问题?

【问题讨论】:

  • 小计范围在哪里?

标签: javascript jquery shopping-cart


【解决方案1】:

问题是您每次将商品添加到购物车时都会重新运行$(".remove-from-cart").click(...),因此所有现有的删除按钮都会获得额外的处理程序。

使用 jQuery 将 HTML 解析为 jQuery 包装的 DOM 结构,然后将其用作.remove-from-cart 选择器的上下文(如this working fiddle 所示)。这样,.remove-from-cart 选择器将仅适用于您新添加的项目。

var selected_product = "<div class=\"item \">" + ...;

// jQuery-wrapped DOM structure
var $prod = $(selected_product)

$prod.insertBefore("#subtotals");
register("add", amount, hours);

// use $prod as jQuery context argument,
// so `.remove-from-cart` only looks in this DOM tree
$(".remove-from-cart", $prod).click(function() {    
    ...
});

【讨论】:

  • apsillers,非常感谢!这正是发生的事情,但我不知道如何解释或解决问题。我试图使用 Chrome 开发工具对其进行调试,但不知道如何进入代码。您是否使用调试器来解决此问题?如果是这样,你介意告诉我你用的是什么吗?我真的很想了解如何调试我的 javascript/jquery。
  • 我手动调试了它:我首先在register 中放置了一个console.log(arguments),然后发现单击会导致多次减法。由于代码只有一次调用register("subtract",...),我知道click 处理程序必须在每次点击时触发多次。因此,单击处理程序必须多次绑定到每个按钮。最终,我能够快速解决问题,因为我过去曾见过非常相似的问题(有时是我自己造成的!),而不是通过熟练使用调试工具。对不起,这不是太有帮助!
  • apsillers,谢谢!您的回答非常有帮助,感谢您花时间解释!我投票赞成你的评论!我在我的代码中记录了错误的区域,我没想到要查看 remove click 函数,即使这正是错误发生的地方!再次感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 2015-07-05
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2020-01-14
相关资源
最近更新 更多