在 Ajax 调用后向 JQuery keyup() 添加延迟
Adding a delay to JQuery keyup() after Ajax call
我遇到了一个非常棘手的问题,我不确定如何解决它。我有几个连续的文本框,我需要填写这些文本框。每次填充文本框时,我都会获取该值并使用该值进行 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
});
现在,有 2 个选项:
我关于延迟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);
}
});
你可以试试这个来延迟 keyup
$('input').keyup(function() {
delay(function(){
alert('Time elapsed!');
}, 1000 );
});
您应该使用 change 事件而不是 keyup。来自文档:
The keyup event is sent to an element when the user releases a key on
the keyboard. It can be attached to any element, but the event is only
sent to the element that has the focus.
当您按下 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);
}
});
});
}
我遇到了一个非常棘手的问题,我不确定如何解决它。我有几个连续的文本框,我需要填写这些文本框。每次填充文本框时,我都会获取该值并使用该值进行 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
});
现在,有 2 个选项:
我关于延迟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);
}
});
你可以试试这个来延迟 keyup
$('input').keyup(function() {
delay(function(){
alert('Time elapsed!');
}, 1000 );
});
您应该使用 change 事件而不是 keyup。来自文档:
The keyup event is sent to an element when the user releases a key on the keyboard. It can be attached to any element, but the event is only sent to the element that has the focus.
当您按下 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);
}
});
});
}