【发布时间】:2015-12-30 01:29:31
【问题描述】:
我遇到了一个非常棘手的问题,我不知道该如何解决。我连续有几个文本框,我需要填写这些文本框。每次填充文本框时,我都会抓取该值并进行使用该值的 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 的 sn-p。我将其剥离并删除了不必要的代码。
$( ".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
});
现在,有两种选择:
关于延迟 Tab 键,我的逻辑是错误的。有没有更好的逻辑来克服我最初的问题?
我错误地使用了上面发布的解决方案。
希望能得到一些建设性的答案。
谢谢。
编辑:这是完整的代码,应要求提供。
$( ".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);
}
});
【问题讨论】:
-
您为什么不向我们展示代码,以便我们弄清楚它为什么不起作用。听起来你可能有全局变量,每个请求都会覆盖它们。
-
@epascarello 代码很长。我用当前代码更新了它。
标签: javascript jquery ajax tabs