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×tamp=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×tamp=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;//..}