2013-11-20 29 views
1

我有这个购物车脚本,我正在尝试修改。麻烦的是,每当我尝试删除购物车中的多个商品时,我都会得到一个负值。当所有项目被删除时,购物车永远不会归零。我可以添加项目罚款。Javascript:从购物车中减去商品的结果为负值

Here is the fiddle.

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

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)会导致总数变为负值。我怎样才能解决这个问题?

+0

凡大部作用域? – Maess

回答

2

的问题是,你重新运行$(".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() {  
    ... 
}); 
+0

apsillers,非常感谢!这正是发生了什么,但我无法弄清楚如何解释或解决问题。我试图使用Chrome开发工具进行调试,但无法弄清楚如何进入代码。你用调试器来解决这个问题吗?如果是这样,你介意告诉我你使用了什么?我真的很想了解如何调试我的javascript/jQuery。 – Chris22

+1

我手动调试它:我首先在'register'内部放置了一个'console.log(arguments)',看到单击是造成多次减法。由于代码只有一个调用'register(“subtract”,...)',我知道'click'处理程序必须每次点击多次触发。因此,点击处理程序必须多次绑定到每个按钮。最终,我能够很快解决这个问题,因为我过去看到过类似的问题(有时是由我自己造成的),而不是熟练地使用调试工具。对不起,这不是太有帮助! – apsillers

+0

apsillers,谢谢!你的回答不仅仅是有用的,我感谢你花时间来解释!我把你的评论投给你!我在我的代码中记录了错误的地方,我没有想到查看删除'click'函数,即使这正是错误发生的地方!再次感谢您的解决方案! – Chris22

相关问题