在Ajax调用

时间:2015-12-29 14:28:52

标签: javascript jquery ajax tabs

我遇到了一个非常棘手的问题,我不确定如何处理它。我连续有几个文本框,我需要填写这些文本框。每次填充文本框时,我都会获取该值并进行使用该值的Ajax调用。响应确定该文本框是红色还是绿色(使用Jquery css()函数)。

现在问题就在于此。假设我连续有5个文本框。假设我输入1-tab,2-tab,2-tab,1-tab,1-tab。所有这一切都非常快。例如,1-tab表示我键入1,然后按Tab键移动到下一个文本框。我意识到如果我走得太快,一些文本框不会更新,它们的颜色也不会改变。我认为这是由于ajax需要一些时间来处理。

我想到了这个问题并提出了一个可以解决问题的想法。这是在每个Ajax调用之后添加延迟,然后选项卡到下一个。我搜索S.O并找到this solution。但是,它并不适合我(基本上它会中断,JS根本不起作用)。

这是我的AJAX的片段。我将其剥离并删除了不必要的代码。

$( ".myTextbox" ).keyup(function() {
        //Defining my variables here

        $.ajax({    
            //Perform First Ajax request

            $.ajax({   
                //Perform Second Ajax Request
            });  

        });
});

以下是我尝试使用我从S.O找到的解决方案的解决方案,但它不起作用。

var timer = null;
$( ".myTextbox" ).keyup(function() {
        clearTimeout(timer);

        timer = setTimeout(
            function(){
                .ajax({    
                //Perform First Ajax request                        
                    $.ajax({   
                        //Perform Second Ajax Request
                    });                  
                });
            }, 200);
        //Defining my variables here
});

现在,有两个选项:

  1. 我的逻辑错误是延迟Tab键。能否有更好的逻辑来克服我最初的问题?

  2. 我正在错误地使用上面发布的解决方案。

  3. 希望得到一些建设性的答案。

    感谢。

    编辑:根据要求,这是完整的代码。

    $( ".getqty" ).keyup(function() {
        var split = this.id.split(":");
        var color = split[0];
        var size = split[1];
        var prodID = split[2];
        var $this = $(this);
        var value = $this.val();
        var stock = 0;
        var price = split[3];
        var originalProd = split[4];
        var dataStock = $this.attr("data-stock");
        if(value.length > 0){
            value = parseInt(value);
        }else{
            value = "";
        }
    
        $.ajax({    //create an ajax request 
            type: 'POST',
            url: 'includes/add.php',             
            dataType: 'html',   //expect html to be returned   
            data:'color='+color+'&size='+size+'&prodID='+prodID+'&qty='+value+'&originalProd='+originalProd+'&dataStock='+dataStock,     
            success: function(response){   
                if(response == "breakOut"){              
                       $this.css('background-color', '#F87171').css('border', '1px solid #B42C2C');  
                       $("#"+originalProd+"-"+color).text("Not enough in stock.").css('color', '#B42C2C');   
                       $("#"+originalProd+"-totalPrice").text("");
                }else{
                    stock = response;
                    if((value > 0 && value <= stock) || (value > 0 && dataStock == 'yes')){
                            $this.css('background-color', '#66CF66').css('border', '1px solid #277230');                        
                    }else{
                        $this.css('background-color', '#fff').css('border', '1px solid #ccc');
                    }   
    
                    var count = 0;
                    $("."+color+"-" + originalProd).each(function(){
                            if($(this).val() == 0){
                                count = count + 0;
                            }else{
                                count = count + parseFloat($(this).val(), 10);
                            }
                    });
    
                    //Single Item Total
                    if(count > 0){
                        var totalPrice = (price * count).toFixed(2);
                        $("#"+originalProd+"-"+color).text(count + " - " + totalPrice.toString().replace(/\./g, ',') + " Eur").css('color', '#CCC');
                    }else{
                        $("#"+originalProd+"-"+color).text("");
                    }
    
    
                    $.ajax({    //create an ajax request
                        type: 'POST',
                        url: 'includes/cart.php',             
                        dataType: 'html',   //expect html to be returned   
                        success: function(response){                   
                            if(response > 0){
                                $("#cart_price").text("Cart: "+response.toString().replace(/\./g, ',')+ " Eur");
                            }else{
                                $("#cart_price").text("Cart:0,00 Eur");
                            }                            
                        },
                        error:function (xhr, ajaxOptions, thrownError){
                        // alert(thrownError);
                        }
                    });  
                    if(pathname == 'mycart.php'){
                        location.reload();
                    }                  
                }
            },
            error:function (xhr, ajaxOptions, thrownError){
             //alert(thrownError);
            }
        });
    

2 个答案:

答案 0 :(得分:1)

您应该使用更改事件而不是keyup。来自文档:

  

当用户释放密钥时,keyup事件将发送到元素   键盘。它可以附加到任何元素,但事件只是   发送到有焦点的元素。

当您按Tab键时,您的元素将快速更改焦点,并且可能不会为具有正确值内容的输入文本触发keyup事件。

所以试试:

$( ".getqty" ).change(...)

更新: 由于更改事件仅在输入文本失去焦点时触发,因此您可以改为编写:

$( ".getqty" ).on('input', function() {
  var $this = $(this);
  var value = $this.val();

  if (value.length > 0) {
    value = parseInt(value);
  }
  else {
    value = "";
  }

  $.ajax({
    type: 'POST',
    url: 'data.txt',             
    dataType: 'text', 
    success: function(response){   
      $this.css('background-color', '#66CF66').css('border', '1px solid #277230');                        

      $.ajax({
        type: 'POST',
        url: 'data.txt',             
        dataType: 'text', 
        success: function(response){                   
          $("#cart_price").text("Cart: "+response.toString().replace(/\./g, ',')+ " Eur");                          
        },
        error:function (xhr, ajaxOptions, thrownError){
          console.log(thrownError);
        }
      });                 
    },
    error: function (xhr, ajaxOptions, thrownError){
     console.log(thrownError);
    }
  });
});

或使用纯javascript事件侦听器:

var elemList = document.getElementsByClassName('getqty');
for (var i = 0; i < elemList.length; i++) {
  elemList[i].addEventListener('input', function(e) {
    var $this = $(e.target);
    var value = $this.val();

    if (value.length > 0) {
      value = parseInt(value);
    }
    else {
      value = "";
    }

    $.ajax({
      type: 'POST',
      url: 'data.txt',             
      dataType: 'text', 
      success: function(response){   
        $this.css('background-color', '#66CF66').css('border', '1px solid #277230');                        

        $.ajax({
          type: 'POST',
          url: 'data.txt',             
          dataType: 'txt', 
          success: function(response){                   
            $("#cart_price").text("Cart: "+response.toString().replace(/\./g, ',')+ " Eur");                          
          },
          error:function (xhr, ajaxOptions, thrownError){
            console.log(thrownError);
          }
        });                 
      },
      error: function (xhr, ajaxOptions, thrownError){
       console.log(thrownError);
      }
    });
  });
}

答案 1 :(得分:0)

您可以尝试此操作来延迟加密

$('input').keyup(function() {
    delay(function(){
      alert('Time elapsed!');
    }, 1000 );
});