0

私は非常に厄介な問題に直面しています。js SimpleCart を使用して、ショーのチケットを購入します。大人用と子供用の場所があります。そこで、大人の人数と子供の人数を選択する 2 つの入力を作成します。カートに入れる際、「beforeAdd」で各フィールドの値が数字になっていることを確認しています。「はい」の場合、2 番目のフィールドをチェックします。「いいえ」の場合、アラートを表示します。最初のフィールドは非常によく反応します。しかし、2 番目のループは、最初のフィールドのアラートで無期限にループします。私はこれを理解できません。誰にもアイデアはありますか?

ここにコードがあります

    $('.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;
            }
        });
    });

どうもありがとう

4

1 に答える 1

0

beforeAdd追加は、イベントにバインドされた関数内で行われています。

つまり、関数内で add が実行されると、すぐに同じイベント ハンドラーが再度トリガーされ、表示されている無限サイクルが発生します。

何が起こっているかは次のとおりです。

  1. カートに「追加」します。
  2. これにより、イベント ハンドラーが開始されます。
  3. 最初のテストに合格し、大人の数が 0 を超えるため、大人の料金が追加されます。
  4. この「追加」により、イベントが再び開始されますが、現在のコードが終了するまで待機します。
  5. 現在のコードが続行され、2 番目のテストが失敗してアラートがスローされます。
  6. アラートがクリアされ、現在のコードが終了したため、以前にトリガーされたイベントが呼び出されます。
  7. 上記のステージ 2 に戻りました。

ご覧のとおり、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()正確なケースに合わせての条件を微調整したい場合があります。

それが役立つことを願っています。

于 2013-01-18T14:12:18.930 に答える