Javascript如何等待单击功能完成,然后在用户再次单击后才重复相同的功能?

Javascript如何等待单击功能完成,然后在用户再次单击后才重复相同的功能?,javascript,ajax,Javascript,Ajax,下面是我的html,我在做一个简单的文本游戏,玩家想卖掉他们的物品 <input name="gg1" id="gg1" value="10"> <a href="javascript:;" onclick="fastbtn(1);">Sale</a> <script> function fastbtn(sid){ var aa = jQuery("#gg"+sid).val(); if(aa > 0){ aa--;

下面是我的
html
,我在做一个简单的文本游戏,玩家想卖掉他们的物品

<input name="gg1" id="gg1" value="10">
<a href="javascript:;" onclick="fastbtn(1);">Sale</a>
<script>
  function fastbtn(sid){
  var aa = jQuery("#gg"+sid).val();
  if(aa > 0){
      aa--;
      jQuery("#gg"+sid).attr("value", aa);
      ajaxget('plugin.php?id=game&do=store&submit=true&timestamp=12345&gg1[1]=1&ggqty[1]=1&formhash={FORMHASH}&fastbuy=true','bbb'); //this is my ajax function -> ajaxget(requesturl,return result to id);
  }
</script>

功能fastbtn(sid){
var aa=jQuery(“#gg”+sid).val();
如果(aa>0){
aa--;
jQuery(“#gg”+sid).attr(“value”,aa);
ajaxget('plugin.php?id=game&do=store&submit=true×tamp=12345&gg1[1]=1&ggqty[1]=1&formhash={formhash}&fastbuy=true','bbb');//这是我的ajax函数->ajaxget(requesturl,将结果返回到id);
}
例如,
value=10
,但当用户点击
10次(快速点击)时,
值变为
0
,但我的服务器端只处理
8次

它是否能与服务器端的点击量相匹配


在我看来,第二次点击
fastbtn(sid)
是否可以等到第一次点击
fastbtn(sid)为止
的ajaxget
已完成,然后仅处理?

之所以发生这种情况,是因为ajax网络请求将花费一些有限的时间,快速单击将发送许多请求,这些请求尚未在服务器上处理,但您正在执行
aa--
导致差异

有很多方法可以解决这个问题,最简单的方法就是在ajax处于挂起状态时禁用按钮,这将把任何给定时间点的活动ajax请求限制为1

但是,由于您使用的是锚定标记,因此不可能禁用锚定标记,但可以改用标志(
isPending

  • 因此,在加载时,我们初始化标志以表示“没有挂起” 请求您可以继续“(false

  • 当继续执行ajax时,我们将标志设置为“对不起,现在正忙” 请稍后再试“(true

  • ajax完成后,我们再次将标志重置为false

因此,每当用户单击时,我们首先检查“是否清除”,如果没有,我们只从
fastbn()
返回,不做任何操作

假设您正在为ajax使用jQuery的get()函数,您可以遵循以下步骤

<script>
    var isPending = false
    function fastbtn(sid, t){
        if(isPending)
        return;

        var aa = jQuery("#gg"+sid).val();
        if(aa > 0){
            aa--;
            jQuery("#gg"+sid).attr("value", aa);

            ajaxget('plugin.php?id=game&do=store&submit=true&timestamp=12345&gg1[1]=1&ggqty[1]=1&formhash={FORMHASH}&fastbuy=true','bbb'); //this is my ajax function -> ajaxget(requesturl,return result to id);
        }

        //...
        //..
        //.
    }

    function ajaxget(url){
        isPending = true;
        $.get(url, function(data, status){
           // <--only fires on success
        })
        .done(function() { // <--only fires on success

        })
        .fail(function() {  // <-- only fires on error

        })
        .always(function() {  // <-- this always fires
            isPending = false; 
        }); 
    }
</script>

var isPending=false
函数fastbtn(sid,t){
如果(iSping)
回来
var aa=jQuery(“#gg”+sid).val();
如果(aa>0){
aa--;
jQuery(“#gg”+sid).attr(“value”,aa);
ajaxget('plugin.php?id=game&do=store&submit=true×tamp=12345&gg1[1]=1&ggqty[1]=1&formhash={formhash}&fastbuy=true','bbb');//这是我的ajax函数->ajaxget(requesturl,将结果返回到id);
}
//...
//..
//.
}
函数ajaxget(url){
isPending=true;
$.get(url、函数(数据、状态){

//在服务器更新该值之前不要更新该值。是否
ajaxget()
返回承诺?嗨,我可以知道
函数fastbtn(sid,t)
t
是用于?是的,如果您有按钮,您可以使用
。然后我们可以使用
引用按钮在
函数fastbtn内启用/禁用它(sid,t){t.disabled=true;//..}