在jquery表单序列化变量中设置jquery延迟

时间:2015-01-17 13:21:57

标签: javascript php jquery serialization opencart

这是我使用ajax在购物车中添加产品的简单代码,但是当用户点击太快时,某些产品不会添加到购物车中。 在第一行,我在调用ajax并在购物车中添加产品后使用序列化从表单中获取数据。 现在给我解决方案,我可以把超时或延迟和类似的东西,所以执行暂停有时。

var datas = form.serialize();

            if(usefancy){
                $.fancybox.showActivity();
            }

            $.getJSON(vmSiteurl+'index.php?option=com_virtuemart&nosef=1&view=cart&task=addJS&format=json'+vmLang,encodeURIComponent(datas),
            function(datas, textStatus) {
                if(datas.stat ==1){

                    var txt = datas.msg;
                } else if(datas.stat ==2){
                    var txt = datas.msg +"<H4>"+form.find(".pname").val()+"</H4>";
                } else {
                    var txt = "<H4>"+vmCartError+"</H4>"+datas.msg;
                }

3 个答案:

答案 0 :(得分:0)

将其包装在一个函数中:

var datas = '';
setTimeout(function(){
    datas=form.serialize();
},1000);

更好的方法

当用户完成添加产品时触发的查找和事件(可能是点击的按钮或类似的东西),然后进行序列化和ajax调用。

假设您有一个id =“sendProduct”的按钮

<button id="sendProduct">Send product</button>
你可以做点什么:

$("#sendProduct").click(function () {// Everytime user clicks "sendProduct" you will send info to the server.
    var datas = form.serialize();

    if (usefancy) {
        $.fancybox.showActivity();
    }

    $.getJSON(vmSiteurl + 'index.php?option=com_virtuemart&nosef=1&view=cart&task=addJS&format=json' + vmLang, encodeURIComponent(datas),

    function (datas, textStatus) {
        if (datas.stat == 1) {
            var txt = datas.msg;
        } else if (datas.stat == 2) {
            var txt = datas.msg + "<H4>" + form.find(".pname").val() + "</H4>";
        } else {
            var txt = "<H4>" + vmCartError + "</H4>" + datas.msg;
        }
    });
});

答案 1 :(得分:0)

   setTimeout(function(){
       var datas = form.serialize();
    }, 3000); 

3000相当于3秒(3000毫秒)。

答案 2 :(得分:0)

使用setTimeout是一种非常不可靠的更新变量的方法(如果jQuery函数即使在3秒内也无法执行该怎么办?)。相反,您应该使用许多callback函数中提供的jQuery功能,并在callback函数中设置变量。

编辑:对于用户点击过快的问题,您必须实施一个简单的锁定机制,以便在将项目添加到购物车时,禁用“添加到购物车”选项。这可以这样做:

var cartLock = false;     //means you can add items to cart

因为,您需要能够捕获complete,我建议采用以下方法,

   $.ajax({
      type: "GET",
      url: url,
      dataType: "json",
      beforeSend: function(msg){
        cartLock = true;                 // Just before calling
      },
      success: function(msg){
        // your logic here
      },
      complete: function(){
        cartLock = false;                // After request completes
      }
    });

现在,您需要进行的最后一项检查是:$.ajax() cartLock时,您只能致电false。希望这是有道理的。