2015-01-17 2 views
1

Это мой простой код для добавления товаров в корзину с помощью ajax, но когда пользователь нажимал слишком быстро, некоторые продукты не добавляются в корзину. В первой строке я извлекаю данные из формы, используя сериализацию после вызова ajax и добавляю продукт в корзину. Теперь дайте мне решение для него, где я могу установить тайм-аут или задержку и что-то подобное, так что остановка исполнения иногда.set jquery delay in jquery form serialize variable

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

ответ

0

Просто оберните его в функцию:

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

Лучше подход

Найти и событие, которое срабатывает, когда пользователь заканчивает добавления продуктов (возможно кнопка нажата или что-то в этом роде) и затем выполнить сериализацию и вызов ajax.

Предположив вы кнопка с идентификатором = "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; 
     } 
    }); 
}); 
+0

У меня есть еще один вопрос, связанный с вышеуказанным вопросом, это правильный способ означает, что можно установить задержку в переменной – Prabhash

+0

Это означает, что после секунды данные будут содержать значение формы, сериализованной. Я точно не знаю, в чем проблема, в зависимости от проблемы это может быть решением или нет. – acontell

+0

На самом деле проблема в том, что у меня есть jquery ajax для добавления продукта в корзину, когда пользователь медленно добавляет продукт, а затем все работает нормально, но когда пользователь спешит, некоторые из продуктов не добавлены в корзину. Я думал, что если установить задержку в переменной назначения, тогда проблема должна быть решена. – Prabhash

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

Были 3000 эквивалентна 3 секунды (3000 миллисекунд).

0

Использование setTimeout - очень ненадежный способ обновления переменных (что, если функция jQuery не может выполняться даже через 3 секунды?). Скорее вы должны использовать функциональность callback, доступную во многих функциях jQuery, и установить переменную в этой функции callback.

EDIT: Для проблемы с быстрым нажатием на пользователя вы должны реализовать простой механизм блокировки, так что, пока элемент добавляется в корзину, опция «добавить в корзину» отключена. Это может быть сделано как:

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. Надеюсь, это имеет смысл.

+0

Я обновил ответ для быстрого нажатия. Отдых должен работать нормально. Примите ответ, если он решает вашу проблему. – activatedgeek