【问题标题】:Shopify Order form Ajax loops twiceShopify 订单表单 Ajax 循环两次
【发布时间】:2015-12-19 14:53:16
【问题描述】:

我在产品页面上有一个 Ajax 订单。当您单击#submit-table 按钮时,它将显示一个下拉菜单,其中显示更新的购物车信息,包括更新的数量和价格以及刚刚添加的产品。

这是我的问题的图片(应该只显示绿色的正确项目):

到目前为止,这是我的代码,但它触发了两次,从而复制了产品,这是怎么回事?

$(document).ready(function () {
$("#submit-table").click(function(e) {
    e.preventDefault();
    //array for Variant Titles
    var toAdd = new Array();
  var qty;

    for(i=0; i < length; i++){
        toAdd.push({
            variant_id: $("#variant-"+i).val(),
            quantity_id: $("#quantity-"+i).val() || 0
        });
    }

    function moveAlong(){
        if (toAdd.length) {
            var request = toAdd.shift();
            var tempId= request.variant_id;
            var tempQty = request.quantity_id;
            var params = {
                type: 'POST',
                url: '/cart/add.js',
                data: 'quantity='+tempQty+'&id='+tempId,
                dataType: 'json',
                success: function(line_item) {

          jQuery.getJSON('/cart.js', function(cart, variant, item, line_item) {
            $('nav .customer-wrap ul li.basket span').text(cart.item_count);
            $( '<li class="c-1"><a href="{{ item.url }}" title="View product">  <div class="qc-thumb"><img src="{{ item.product.featured_image.src | product_img_url: 'thumbnail' }}" alt="{{ item.title }}" class="wk-variant-image" /></div>  <div class="qc-details"><p>{{ product.title }}</p>  <p>Qty:' + tempQty + '</p></div></a></li>' ).prependTo( ".basket-quick-view" );
          });

          console.log("success!");
          setTimeout(function () {
            $('nav .customer-wrap ul li.basket ul.basket-quick-view').removeClass('variant-added');
          }, 3000);

          moveAlong();

                },
                error: function() {
                    console.log("fail");
                    moveAlong();
                }
            };
            $.ajax(params);
        }
        else {
            //document.location.href = '/cart';
        }
    };

  jQuery.getJSON('/cart.js', function(cart, variant) {
    $('nav .customer-wrap ul li.basket span').addClass('product-added');
    $('li.empty').hide();
    $('nav .customer-wrap ul li.basket ul.basket-quick-view').addClass('variant-added');
  });

    moveAlong();
});
});

【问题讨论】:

  • 难道不是因为您在代码中两次发出GET 请求吗?
  • id 为 submit-table 的元素是否有一个带有 click 事件处理程序的子元素?

标签: javascript jquery ajax shopify


【解决方案1】:

因为您在对cart/add.js 的ajax 调用的success() 处理程序中再次调用moveAlong() 方法

success: function(line_item) {

          jQuery.getJSON('/cart.js', function(cart, variant, item, line_item) {
            $('nav .customer-wrap ul li.basket span').text(cart.item_count);
            $( '<li>Removed for clarity </li>' ).prependTo(".basket-quick-view" );
          });

          console.log("success!");
          setTimeout(function () {
            $('nav .customer-wrap ul li.basket ul.basket-quick-view')
                                                       .removeClass('variant-added');
          }, 3000);

          moveAlong();  // Calling it again.

 }

我还建议将moveAlong 方法的定义移出提交按钮单击事件之外。您可以在 click 事件范围之外定义它,并从 click 事件中调用 moveAlong() 方法。像这样的。

$(document).ready(function () {
   $("#submit-table").click(function(e) {
    e.preventDefault();
       postCartData();
   });
});
function postCartData()
{
   //create the data to send and do call to cart/add
   $.ajax( "cart/add.php" )
  .done(function(response) {
     console.log(response);
     alert( "success" );
     getCartDataAndDisplay();
  })
  .fail(function() {
     alert( "error" );
  });

}
function getCartDataAndDisplay()
{
  //get the cart data and display
  jQuery.getJSON('/cart.js',function(res){
    console.log(res);
     //parse the response and build the UI
  });
}

【讨论】:

  • 我不确定我是否正确解释了您的代码,但现在尝试添加到购物车时收到 400 错误请求,这是我尝试将您的解决方案与我需要什么,你能看看我哪里出错了吗? pastebin.com/4nNwM0eS
  • 你仍在另一个 ajax 调用中进行一个 ajax 调用!
  • 请原谅我对 ajax 了解不多。我该怎么办?
  • 使用我发布的代码并进行必要的更改(数据,网址等),它应该这样做
  • 我以为我已经做到了,但显然我搞混了。你能帮忙吗?我真的欠你一个!
【解决方案2】:

只需在 moveAlong 函数中使用 moveAlong() 即可

$(document).ready(function () {
$("#submit-table").click(function(e) {
    e.preventDefault();
    //array for Variant Titles
    var toAdd = new Array();
  var qty;

    for(i=0; i < length; i++){
        toAdd.push({
            variant_id: $("#variant-"+i).val(),
            quantity_id: $("#quantity-"+i).val() || 0
        });
    }

    function moveAlong(){
        if (toAdd.length) {
            var request = toAdd.shift();
            var tempId= request.variant_id;
            var tempQty = request.quantity_id;
            var params = {
                type: 'POST',
                url: '/cart/add.js',
                data: 'quantity='+tempQty+'&id='+tempId,
                dataType: 'json',
                success: function(line_item) {

          jQuery.getJSON('/cart.js', function(cart, variant, item, line_item) {
            $('nav .customer-wrap ul li.basket span').text(cart.item_count);
            $( '<li class="c-1"><a href="{{ item.url }}" title="View product">  <div class="qc-thumb"><img src="{{ item.product.featured_image.src | product_img_url: 'thumbnail' }}" alt="{{ item.title }}" class="wk-variant-image" /></div>  <div class="qc-details"><p>{{ product.title }}</p>  <p>Qty:' + tempQty + '</p></div></a></li>' ).prependTo( ".basket-quick-view" );
          });

          console.log("success!");
          setTimeout(function () {
            $('nav .customer-wrap ul li.basket ul.basket-quick-view').removeClass('variant-added');
          }, 3000);

          //moveAlong(); get ride of this

                },
                error: function() {
                    console.log("fail");
                    moveAlong();
                }
            };
            $.ajax(params);
        }
        else {
            //document.location.href = '/cart';
        }
    };

  jQuery.getJSON('/cart.js', function(cart, variant) {
    $('nav .customer-wrap ul li.basket span').addClass('product-added');
    $('li.empty').hide();
    $('nav .customer-wrap ul li.basket ul.basket-quick-view').addClass('variant-added');
  });

    moveAlong();
});
});

【讨论】:

  • 用你的代码替换我的代码后,它看起来好像正确添加了一个产品,但是如果我从另一个页面添加另一个产品,ajax 会触发它看起来好像已经添加了,但是如果我转到实际的购物车页面,它只显示第一个产品,而不是我之后添加的其他产品
  • 查看您在 cart/add.js 中的代码。 Ajax 成功并不意味着它成功保存到 db 或任何操作,它只是意味着你的代码没有抛出错误
  • 我不能这样做,因为它是 Shopify 资产,因此无法更改。他们提供了他们的 API:docs.shopify.com/support/your-website/themes/can-i-use-ajax-api
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2018-06-03
相关资源
最近更新 更多