【问题标题】:Cant update quantity using select option with the help of ajax无法在 ajax 的帮助下使用选择选项更新数量
【发布时间】:2019-03-28 17:57:12
【问题描述】:

我正在创建一个简单的添加到购物车功能,当用户成功将他们的产品添加到购物车时,他们可以查看他们的购物车并使用购物车页面中的选择选项更新数量,但似乎我只能更新已添加到购物车的第一个产品,如果我添加第二个产品,我无法更新该第二个产品

cart.php

    <?php
      if(isset($_COOKIE["shopping_cart"]))
        {
        $total = 0;
        $cookie_data = stripslashes($_COOKIE['shopping_cart']);
        $cart_data = json_decode($cookie_data, true);
       ?>  
       <?php
        foreach($cart_data as $keys => $values)
         {
          ?>  
     <form id="myForm">
              <input type="hidden" name="hidden_id"  value="<?php echo $values["item_id"];?>">

                <select name="qty" id="qty" class="form-control">

                <option style="display:none;" selected><?php echo $values["item_quantity"];?></option>

                <?php
                for($i=1; $i<=$values["item_qty"]; $i++)
                   {
                    ?>

                  <option value="<?php echo $i;?>"><?php echo $i;?></option>
                  <?php
                    }
                  ?> 
                </select>

               </form>
            }

     }



  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
     <script type="text/javascript">
      $(document).ready(function(){  
      $("#qty").change(function(){  
    var url = "<?php echo URLROOT; ?>"
    var form = $( '#myForm' ).serialize();
     $.ajax({  
    type: "POST",  
    url: url + '/shops/cookiesave', 
    data: form,  
    beforeSend: function() {
     //do something here like load a loading spinner etc.
    },
  })
  .done(function() { 
    window.location.reload(true);
     })
    });
   });
 </script>

我已将 URLROOT 定义为 define('URLROOT', 'http://localhost/vlake');

cookiesave功能

  public function cookiesave(){

$cookie_data = stripslashes($_COOKIE['shopping_cart']);
$cart_data = json_decode($cookie_data, true);
foreach($cart_data as $keys => $values)
{

 if($cart_data[$keys]["item_id"] == $_POST["hidden_id"])
 {
  $cart_data[$keys]["item_quantity"] = $_POST["qty"];
  }
  }

$item_data = json_encode($cart_data);
setcookie('shopping_cart', $item_data, time() + (86400 * 30) ,'/');
}

【问题讨论】:

    标签: javascript php jquery html ajax


    【解决方案1】:

    $("#qty") 只会识别具有该 ID 的第一个元素。所以它只是不处理任何其他事件。在 HTML 中拥有多个具有相同 ID 的元素是无效的 - 毕竟,如果一个 ID 不能唯一标识某物,那么根据定义,它就不是一个 ID!所以 JavaScript / jQuery 将简单地忽略第一个之后的任何重复项。 $( '#myForm' ) 也会有同样的问题。

    你需要使用一个类来识别&lt;select&gt;,然后遍历DOM找到父表单:

        <form>
              <input type="hidden" name="hidden_id"  value="<?php echo $values["item_id"];?>">
    
                <select name="qty" class="qty" class="form-control">
    
                <option style="display:none;" selected><?php echo $values["item_quantity"];?></option>
    
                <?php
                for($i=1; $i<=$values["item_qty"]; $i++)
                {
                ?>
    
                  <option value="<?php echo $i;?>"><?php echo $i;?></option>
                <?php
                    }
                ?> 
                </select>
         </form>
    

    ...和...

    $(".qty").change(function(){  
      var url = "<?php echo URLROOT; ?>"
      var form = $(this).closest("form").serialize();
      $.ajax({  
        type: "POST",  
        url: url + '/shops/cookiesave', 
        data: form,  
        beforeSend: function() {
         //do something here like load a loading spinner etc.
        },
      })
      .done(function() { 
        window.location.reload(true);
      })
    });
    

    注意作为一个设计点...我注意到您在 AJAX 完成后立即重新加载页面。 AJAX 的全部意义在于允许您停留在同一页面上而无需重新加载。为了避免这种不必要的 HTTP 请求重复,您可以

    a) 忘记为此使用 AJAX,只需进行正常的回发以更新数量,或者

    b) 当 AJAX 完成时,使用一点 JavaScript 来更新客户端的 cookie。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2013-05-29
    • 2016-01-29
    • 1970-01-01
    • 2023-03-14
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多