发送新请求时,如何取消AJAX请求?

天使Politis

我知道以前也曾提出过类似的问题,但是尽管已经阅读了足够多的内容,但我仍未能解决我的问题。

我正在创建用户名输入,并使用AJAX从服务器检索响应,具体取决于是否已使用用户名。


我的JavaScript代码:

var timer = null;
var passed4Before = false;
var xhttp = null;
var ajaxInProgress = false;
var username = document.getElementById("username");

username.onkeyup = function(e) {

  // Check if username exists in the database
  function usernameExists(value) {
    if (keypressed.match(/[a-z0-9-_]/gi) || e.which === 8 || e.which === 46) {
      clearTimeout(timer);
      ajaxInProgress = true;
      timer = setTimeout(function() {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
          if (xhttp.readyState === 4 && xhttp.status === 200) {
            document.getElementById("div").innerHTML = xhttp.responseText;
          }
        };
        xhttp.open("POST", "php.php", true);
        xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhttp.send("username=" + value);
      }, 1500);
    }
  };

  if (this.value.length >= 4) {
    // Check if user has typed above 4 characters
    passed4Before = true;
  }

  // AN ATTEMPT TO ABORT THE AJAX REQUEST WHILE IT HAS STARTED THAT HAS FAILED
  // RESULT: THE AJAX DOESN'T WORK AT ALL
  if (ajaxInProgress) {
    xhttp.abort();
    ajaxInProgress = false;
  }


  if (this.value.length < 4) {
    if (passed4Before) {
      console.log("The username cannot be less than 4 characters");
      passed4Before = false;
      // To stop ajax request of the previous key press (if it  hasn't started yet)
      clearTimeout(timer);
    }
  } else {
    usernameExists(this.value);
  }
};



我100%确定必须以某种方式使用xhttp.abort(),但我还没有发现。

我正在使用ajaxInProgress变量来确定是否有一个活动的AJAX请求,如果有,当我再次键入时,它必须停止并检查输入的新值。

当前形式的代码无法实现这一点,但是,它永远不会发出AJAX请求,或者先发送一个请求然后停止。

我希望使用没有任何第三方插件的JavaScript解决方案。任何帮助将不胜感激。

[已解决](包括Gilad Artzi的回答):

对于将来可能需要的人,这里是经过编辑的功能:

function usernameExists(value) {
    if (keypressed.match(/[a-z0-9-_]/gi) || e.which === 8 || e.which === 46) {
        if (xhttp) {
            xhttp.abort();
        }
        xhttp = new XMLHttpRequest();
        clearTimeout(timer);
        timer = setTimeout(function() {
            xhttp.onreadystatechange = function() {
                if (xhttp.readyState === 1) {
                    document.getElementById("loader1").innerHTML = "<img src = \"../../Content/Images/ajax-loader.gif\"/>";
                }
                else if (xhttp.readyState === 4 && xhttp.status === 200) {
                    document.getElementById("loader1").innerHTML = "<img class = \"invisible\" src = \"../../Content/Images/ajax-loader.gif\"/>";
                    document.getElementById("tip1").innerHTML = xhttp.responseText;
                    if (xhttp.responseText.indexOf("unavailable") > 0) {
                        username_label.style.color = "red";
                    }
                    else {
                        username_label.style.color = "green";
                    }
                }
            };
            xhttp.open("POST", "Register.php", true);
            xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhttp.send("username=" + value);
        }, 1500);
    }
};
吉拉德·阿齐(Gilad Artzi)

您应该保留对active的引用XMLHttpRequest,以防万一您触发了新的引用,请使用abort一个引用的方法。

更具体地说,在您的代码中,xhttp在顶部而不是setTimeout回调内部声明var ,然后在创建新的XHR(xhttp = new XMLHttpRequest();)之前简单地中止前一个(如果存在):

if (xhttp) {
    xhttp.abort();
}
xhttp = new XMLHttpRequest();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何取消[NSURLConnection sendAsynchronousRequest:..]发送的请求

来自分类Dev

发送AJAX请求时如何隐藏API密钥?

来自分类Dev

通过Ajax发送请求时如何停止挂起页面

来自分类Dev

发送AJAX请求时如何隐藏API密钥?

来自分类Dev

如何取消Angular Service Ajax请求

来自分类Dev

发送Ajax请求时出现500错误

来自分类Dev

发送Ajax请求时出现500错误

来自分类Dev

Ajax 在表单提交时发送多个请求

来自分类Dev

如果提交了新的AJAX请求,请取消

来自分类Dev

如何配置我的servlet以发送Ajax请求

来自分类Dev

如何使用HttpClient发送Ajax请求

来自分类Dev

如何发送PHP表单的AJAX请求

来自分类Dev

如何跨域发送Ajax请求?

来自分类Dev

如何发送跨域Ajax请求

来自分类Dev

在新请求jqgrid上取消当前请求

来自分类Dev

Ajax请求未发送

来自分类Dev

Ajax未发送请求

来自分类Dev

当发送的数据是html数据时发送ajax请求

来自分类Dev

键入AngularJS时如何发送GET请求?

来自分类Dev

发送带有新URL的AJAX请求和响应

来自分类Dev

使用Angular的$ timeout刷新图像时,取消新请求而不是当前加载请求

来自分类Dev

发送请求时如何将其他参数传递给Ajax响应

来自分类Dev

没有jQuery时,如何发送Ajax请求以检查注册用户字段?

来自分类Dev

如何在axios中取消/中止ajax请求

来自分类Dev

如何取消已经使用本机javascript启动的AJAX请求

来自分类Dev

ajax发布请求发送多个请求

来自分类Dev

使用require时,没有从ajax请求发送响应

来自分类Dev

401向Web API发送Ajax请求时未经授权

来自分类Dev

发送AJAX请求时“未定义ajaxFunction”