JavaScript仅在上次调用时运行函数

JavaScript仅在上次调用时运行函数,javascript,jquery,ajax,twitter-bootstrap,Javascript,Jquery,Ajax,Twitter Bootstrap,我在使用Javascript函数更新引导微调器时遇到了一个问题,一般来说,它工作正常,当我多次单击时就会出现问题,我使用ajax更新为购物车选择的产品数量 如果我只在按钮中单击一次,效果很好,但是如果单击多次以将数量增加10,则该函数将执行10次,并生成10个响应。有点烦人 这就是功能: var contador = 0; function UPDATE_SUM(cant,modo,precio,prod_id,inv_id,lim){ var canti = d

我在使用Javascript函数更新引导微调器时遇到了一个问题,一般来说,它工作正常,当我多次单击时就会出现问题,我使用ajax更新为购物车选择的产品数量

如果我只在按钮中单击一次,效果很好,但是如果单击多次以将数量增加10,则该函数将执行10次,并生成10个响应。有点烦人

这就是功能:

    var contador = 0;
        function UPDATE_SUM(cant,modo,precio,prod_id,inv_id,lim){
    var canti = document.getElementById(cant).value;
    var quantity = canti;
    if(modo == "up"){
        var cantidad = parseInt(canti) + 1;
        if (cantidad > 0 && cantidad <= lim){
            quantity = cantidad;
            document.getElementById(cant).value = quantity;
            x.request('r:ajax/u.php?cant='+cantidad+'&id='+prod_id+'&inv='+inv_id+'; rl:resp');
        }
    }else if(modo == "down"){
        var cantidad = parseInt(canti) - 1;
        if (cantidad > 0){          
            quantity = cantidad;
            document.getElementById(cant).value = quantity;
            x.request('r:ajax/u.php?cant='+cantidad+'&id='+prod_id+'&inv='+inv_id+'; rl:resp');
        }
    }
    console.log("UPDATE_SUM "+contador);
    var precio = parseFloat(precio);
    var sub_total = precio*quantity;
    contador++;
    setTimeout(function(){
        updtQty(prod_id,sub_total,quantity);
    },1000);
    calcSeguro();
    calcTurcoSafe();
    var envio = document.getElementById('inpenvio');
    var turcosafe = document.getElementById('inpturcosafe');
    var seguro = document.getElementById('inpseguro');
    TOTALIZAR(envio,turcosafe,seguro);
}

function updtQty(id,sub_total,qty){
    contador--;
    console.log("updtQty "+contador);
    if(contador == 0){
        $("#resp").fadeIn().delay(5000).fadeOut();
        document.getElementById('sub_total'+id).innerHTML = 'Bs. '+decimales(sub_total,2);
        document.getElementById('subt'+id).value = sub_total;
    }
}
var contador=0;
函数更新和(铁路超高、modo、精度、产品id、库存id、lim){
var canti=document.getElementById(cant).value;
var数量=canti;
如果(modo=“向上”){
var cantidad=parseInt(canti)+1;
如果(cantidad>0&&cantidad 0){
数量=cantidad;
document.getElementById(铁路超高)。值=数量;
x、 请求('r:ajax/u.php?cant='+cantidad+'&id='+prod_id+'&inv='+inv_id+';rl:resp');
}
}
控制台日志(“更新总和”+contador);
var precio=parseFloat(precio);
var sub_总计=精度*数量;
contador++;
setTimeout(函数(){
updtQty(产品id、小计、数量);
},1000);
calcSeguro();
calcTurcoSafe();
var envio=document.getElementById('inpenvio');
var turcosafe=document.getElementById('inpturcosafe');
var seguro=document.getElementById('inpseguro');
积算器(envio、turcosafe、seguro);
}
功能updtQty(标识、小计、数量){
康塔多--;
控制台日志(“updtQty”+contador);
如果(contador==0){
$(“#resp”).fadeIn().delay(5000.fadeOut();
document.getElementById('sub_total'+id.).innerHTML='Bs.+decimales(sub_total,2);
document.getElementById('subt'+id.)。值=小计;
}
}
这是处理程序:

<div class="custom-quantity-input">
                        <input type="text" name="cantidad[]" id="cant6" value="1" readonly="">
                        <input type="hidden" name="subtotal[]" id="subt6" value="135000">
                        <a href="javscript:;" onclick="UPDATE_SUM('cant6','up','135000','6','1','25');" class="quantity-btn quantity-input-up"><i class="fa fa-angle-up"></i></a> <a href="javascript:;" onclick="UPDATE_SUM('cant6','down','135000','6','1','25');" class="quantity-btn quantity-input-down"><i class="fa fa-angle-down"></i></a></div>


任何帮助都将不胜感激

不要在
更新\u SUM
方法中执行动画。相反,在函数外部创建一个新的计数器变量,在
UPDATE_SUM
内部增加它,并将动画延迟到一个新函数,延迟500毫秒(因此,将计数器增加1,并以500毫秒超时/延迟调用新函数)。在动画功能中,将计数器减量1,并且仅在计数器达到0时执行动画。这将确保当用户以超过每500毫秒一次的速度单击按钮时,动画仅播放一次。您可以使用超时持续时间来更好地适应您的用户体验。

我看不到您问题中的事件处理程序,但我假设每次
单击
都会将另一个事件绑定到按钮。创建一个提琴,这样我们可以给你一个更好的答案。谢谢你的答案,我已经更新了代码,你可以看到处理程序。非常感谢你的答案,我认为这是更好的方法。我要试试看,然后再报告。再次感谢。请检查我的代码,我已经用你的建议更新了问题,但是计数器不工作。完成!非常感谢你的回答,我已经更新了问题中的代码。在我的例子中,我调用了多个AJAX,只想在最后一个AJAX承诺实现时调用我的重新启动函数。到目前为止,我找到的唯一解决办法是计数器。有没有更好的解决方法?@Abhi在你的情况下,计数器可能是一个很好的解决方案。