【问题标题】:After <a> onclick, wait the function to be completed and then click/process again<a> onclick后,等待功能完成,然后再次点击/处理
【发布时间】:2020-09-14 00:54:21
【问题描述】:

我正在使用jQuery.get 执行 AJAX 请求。当用户点击&lt;a&gt;时,我通过jQuery.get向服务器发送请求,然后更新&lt;div id='aaa'&gt;ajax call back here&lt;/a&gt;

但是,当用户点击&lt;a&gt;非常快时,返回数据比点击慢,而且&lt;div id ='aaa'&gt;&lt;/a&gt;与数据库中存储的不匹配。

例如&lt;div id='aaa'&gt;10&lt;/div&gt;,当用户点击 1 次时为 -1。用户点击了5次,#aaa应该是&lt;div id='aaa'&gt;5&lt;/div&gt;,但是由于用户点击非常快,所以div显示&lt;div id='aaa'&gt;8&lt;/div&gt;。服务器数据库已更新为5,当用户再点击1次时,&lt;div id='aaa'&gt;8&lt;/div&gt;将变为&lt;div id='aaa'&gt;4&lt;/a&gt;,因为服务器端是5

我知道这是关于 AJAX 网络请求将需要一些有限的时间。

那么,我的函数是否有可能等到jQuery.get 完成并完成,然后才能再次单击/处理。我已经尝试了下面的编码,但上面提到的仍然是同样的问题。

var isPending = false

function fastbtn(sid, t) {
  if (isPending)
    return;
  goodget('', 'plugin.php?id=ttt&do=realland&ac=' + sid + '&click=true');
}

function goodget(url, rid) {
  isPending = true;
  jQuery.get(url, function(data, status) {
      ajaxget(rid); //this ajaxget is my program core template language, ajaxget(url,WaitId), return as XML format;
    })
    .done(function() { // <--only fires on success
      //alert('ok2');
    })
    .fail(function() { // <-- only fires on error

    })
    .always(function() { // <-- this always fires
      isPending = false;
    });
}
<a href="javascript:;" onclick="fastbtn('watering')">some div ...</a>

你会看到编号在跳跃..

【问题讨论】:

  • 可以在调用fastbtn()函数时禁用锚元素,然后在AJAX结束时重新启用它。
  • 我在尝试这个,但是如果用户点击速度很快,因为onclick已经变成空白,那么&lt;a onclick&gt;在我刷新网页之前无法点击。 &lt;a href="javascript:;" id="watering" onclick="fastbtn('watering');"&gt;, &lt;script&gt; function fastbtn(sid, t){ jQuery('#watering').attr('onclick',''); ajaxget('plugin.php?id={$jn}&amp;do=realland&amp;ac='+sid+'&amp;formhash={FORMHASH}','aaa'); }&lt;/script&gt;
  • 你也可以用jQuery定义onclick,HTML不是必须的:$(document).on('click', elem, function() { if (ajaxPending) { return; } else { fastbtn(args) } })

标签: javascript html jquery ajax


【解决方案1】:

我会用button 替换a 标记(因为a 标记的目的是导航)并在点击时将其禁用,除非服务器发送响应。

<button onclick="fastbtn('watering')">some div ...</button>

收到响应后,即成功或失败,再次启用按钮。

var isPending = false

function fastbtn(sid, t) {
  if (isPending)
    return;
  goodget('', 'plugin.php?id=ttt&do=realland&ac=' + sid + '&click=true');
}

function goodget(url, rid) {
  isPending = true;
  $('button').attr("disabled", true)
  jQuery.get(url, function(data, status) {
      ajaxget(rid); //this ajaxget is my program core template language, ajaxget(url,WaitId), return as XML format;
    })
    .done(function() { // <--only fires on success

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

    })
    .always(function() { // <-- this always fires
      isPending = false;
     $('button').attr("disabled", false)
    });
}

编辑 在双哔声输入后更新答案。

【讨论】:

  • erm..这个函数需要使用哪个版本的jQuery?当我点击fastbtn,js 错误..Uncaught ReferenceError: a is not defined,我正在使用 jquery-1.7.2.min.js 和 ui/1.8.21/jquery-ui.min.js ..
  • disabled 属性对锚标签无效 - 请参阅 dev.w3.org/html5/html-author/#the-a-elementstackoverflow.com/q/18711317 等。尝试使用任何 &lt;a&gt;:您会发现它不起作用。
  • @SweeHong 即使使用$('a'),您是否也会收到错误消息?另外我建议您使用按钮,因为a 标签主要用于导航目的。
  • @double-beep 嗯,对。所以在这种情况下,我认为我们应该使用button,因为a 的目的是导航。不是吗?
  • @SweeHong 你现在可以试试。
【解决方案2】:

您可以使用setTimeout。所以

<a href="javascript:void(0);" onclick="fastbtn('watering');">some div ...</a>

var isPendingTimeout = null;
function fastbtn(sid, t) {
  goodget('', 'plugin.php?id=ttt&do=realland&ac=' + sid + '&click=true');

  isPendingTimeout = setTimeout(function(){
    if (isPending == true) {
       clearTimeout(isPendingTimeout);

       ---- do what you want ------
    } 
  }, 25);

  return false;

}

希望它能帮助您解决问题。

【讨论】:

  • setTimeout 可能不是一个好的解决方案,因为您不知道服务器将花费多少时间来处理然后发送响应。
猜你喜欢
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多