2013-11-20 2 views
1

나는 장바구니 스크립트를 수정하려고합니다. 문제는 카트에서 하나 이상의 항목을 삭제하려고 할 때마다 음수 값이 표시된다는 것입니다. 카트는 모든 항목이 삭제되면 다시 0으로 돌아 가지 않습니다. 항목을 잘 추가 할 수 있습니다. 다음은 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 Dev Tools를 사용하여 디버깅하려했지만 코드로 들어가는 방법을 파악할 수 없었습니다. 이 문제를 해결하기 위해 디버거를 사용 했습니까? 그렇다면, 내가 사용한 것을 말해 주시겠습니까? 정말 내 자바 스크립트/jquery를 디버깅하는 방법을 이해하고 싶습니다. – Chris22

+1

필자는 수동으로 디버깅했다 : 먼저'register.log '내에'console.log (arguments)'를 놓았고 단일 클릭으로 인해 여러 개의 빼기가 발생했다. 코드는 단지'register ("subtract", ...)에 대한 호출을 하나만 가지고 있기 때문에, 나는'click' 핸들러가 클릭 당 여러 번 실행되어야한다는 것을 알았다. 따라서 클릭 핸들러는 각 버튼에 여러 번 바인딩되어야합니다. 궁극적으로, 나는 디버깅 도구의 숙련 된 사용보다는 과거에 매우 비슷한 문제를 겪어 왔기 때문에 문제를 신속하게 해결할 수있었습니다. 미안하지만 그렇게 도움이되지 않습니다! – apsillers

+0

apsillers, 감사합니다! 당신의 대답은 도움이되는 것 이상의 것이고, 설명 할 시간을 내 주셔서 감사합니다! 나는 당신의 의견을 투표! 내 코드에서 잘못된 영역을 로깅하는 중이 었는데, 오류가 발생한 위치가 정확히 어디인지에 관계없이 제거 '클릭'기능을 고려하지 않았습니다! 해결책을 찾아 주셔서 다시 한 번 감사드립니다! – Chris22

관련 문제