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;
            }
        });
    });

非常感谢

4

1 回答 1

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()以适合您的具体情况。

希望有帮助。

于 2013-01-18T14:12:18.930 回答