2013-01-18 1 views
0

나는 매우 성가신 문제에 직면하고있다. js SimpleCart를 사용하여 프로그램의 티켓을 구입합니다. 성인과 아이들을위한 장소가 있습니다. 그래서 나는 성인 수와 아이들 수를 선택하는 두 가지 입력을 만듭니다. 장바구니에 추가 할 때 각 입력란의 값이 "beforeAdd"인 숫자인지 확인합니다. "예"인 경우 두 번째 필드를 확인합니다. "아니오"이면 경고를 표시합니다. 첫 번째 필드는 매우 잘 응답합니다. 그러나 두 번째 루프는 첫 번째 필드의 알림에 무기한으로 반복됩니다. 나는 그것을 이해하지 못한다. 아무도 아이디어가 있니?경고 루핑 ... 왜?

여기에 코드를

$('.item_add').click(function() 
    { 
     var id_des_produits = this.id; 
     var selecteur = 'selec' + id_des_produits; 
     var selectionne = ' option:selected'; 
     var valeur_select_photo_ie = $('#selec' + id_des_produits + selectionne).val(); 
     var nombre_adulte = $('#nbre_adulte' + id_des_produits).val(); 
     var nombre_enfant = $('#nbre_enfant' + id_des_produits).val(); 
     var nombre_participant = nombre_adulte + nombre_enfant; 
     var date_d_arrivee = $('.calendrier_front' + id_des_produits).val(); 
     var categorie = $('#date' + id_des_produits).val(); 
     var nom_produit = $('.item_name').html(); 
     var prix_enfant = 10; 
     var prix_adulte = 23; 
     var thumb_produit = $('#thumb_produit_' + id_des_produits).attr('src'); 

     simpleCart.bind("beforeAdd", function(item) 
     { 
      if(chiffre_check.test(nombre_adulte)) 
      { 
       if(nombre_adulte != '0') 
       { 
        simpleCart.add(
        { 
         name: nom_produit + '</br>Tarif adulte' , 
         price: prix_adulte , 
         size: date_d_arrivee , 
         quantity: nombre_adulte , 
         thumb: thumb_produit 
        }); 
       } 
      return true; 
      } 
      else 
      { 
       alert('Précisez le nombre d\'adulte'); 
       return false; 
      } 
      if(chiffre_check.test(nombre_enfant)) 
      { 
       if(nombre_enfant != '0') 
       { 
        simpleCart.add(
        { 
         name: nom_produit + '</br>Tarif enfant' , 
         price: prix_enfant , 
         size: date_d_arrivee , 
         quantity: nombre_enfant , 
         thumb: thumb_produit 
        }); 
       } 
      return true; 
      } 
      else 
      { 
       alert('Précisez le nombre d\'enfant'); 
       return false; 
      } 
     }); 
    }); 

감사

답변

0

beforeAdd 이벤트에 바인딩 된 함수 내에서 수행되고있는 추가합니다 많은입니다.

이것은 함수 내부의 추가 작업이 수행 될 때 즉시 동일한 이벤트 처리기를 다시 트리거하므로 사용자가보고있는 무한 사이클이 발생 함을 의미합니다.

  1. 에 "추가"장바구니에 이루어집니다 다음과 같이 무슨 일이 일어나고 무엇

    이다.

  2. 이렇게하면 이벤트 처리기가 시작됩니다.
  3. 첫 번째 테스트는 통과하지만 성인 수는> 0이므로 성인 요금이 추가됩니다.
  4. 이 "추가"는 이벤트가 다시 시작되도록 트리거하지만 현재 코드가 끝날 때까지 대기합니다.
  5. 현재 코드가 계속 실행되고 두 번째 테스트가 실패하므로 경고가 발생합니다.
  6. 경고가 지워지고 현재 코드가 완료되어 이전에 트리거 된 이벤트가 호출됩니다.
  7. 이제 위의 2 단계로 돌아 왔습니다.

두 번째 테스트의 경고가 반복되는 것을 볼 수 있겠지만, 실제로 성공한 첫 번째 테스트와 루프가 원인이되는 추가 작업입니다. 또한 성인 관세가 무한 수 추가되기 때문에 아마도 귀하의 의도가 아닙니다!

이런 종류의 문제를 해결하려면 이벤트 트리거 기능의 시작 부분에 추가 검사가 필요합니다.이 기능은 추가되는 항목이 자체적으로 추가되는 유형 인 경우 종료하도록 지시합니다.

가능한 솔루션은 다음과 같이 보일 수 있습니다

simpleCart.bind("beforeAdd", function(item) 
    { 
    if(item.name.match(/(Tarif adulte|Tarif enfant)$/)) 
     { 
     return; //exit the event handler if it's one of the tarif items, to prevent the event handler looping. 
     } 
    //.... rest of your existing code for the beforeAdd function continues here... 

이 솔루션은 항목의 이름을 기반으로; 정확한 케이스에 맞게 if()의 조건을 조정할 수 있습니다.

희망이 있습니다.