【问题标题】:Why doesn't readyState == 0 work为什么 readyState == 0 不起作用
【发布时间】:2018-04-11 15:23:48
【问题描述】:

所以我的问题是当我使用if(this.readyState == 0) 它不做它的工作。我有一个用 ajax 加载表单的脚本,我可以选择关闭表单,但后来我意识到,如果我想再次打开该表单而不发出新的 ajax 请求,我将需要某种变量。我有一个名为“isOpen”的变量,当 xhr readyState 为 0 时,我希望它检查 isOpen 是否为真,如果它为真,它会中止 xhr 并显示表单数据。现在它似乎没有像我预期的那样工作。

这是我处理这个 AJAX 请求的全部函数。

function postPlacesForm() {
var yhteys = new XMLHttpRequest();
yhteys.onreadystatechange = function() {
    var isOpen = false;
    if(this.readyState === 0) {
        if(isOpen === false) {

        }
        else if(isOpen === true) {
            document.getElementById("places").style.display = "block";
            yhteys.abort();
        }
    }
    if(this.readyState === 4 && this.status === 200) {
        document.getElementById("places").innerHTML = this.responseText;
        document.getElementById("places").style.display = "block";
        document.getElementById("ajax_close").style.display = "block";
        isOpen = true;
    }

};
yhteys.open("POST", "/js/ajax_inc/forms/postplaces.php", true);
yhteys.send();

}

【问题讨论】:

  • 不确定,但我的猜测是 readyState 值从 0 开始,readystatechange 事件发生在 readyState 值更改为非零值之后。
  • 您可能会做的一件事是将console.log(this.readyState) 放在处理函数的顶部,以便您知道它实际上是什么。
  • if(isOpen === false) { 将永远为真。 总是。 所以如果 readystate 为 0 无关紧要,因为无论如何你都不会做任何事情。
  • 使用浏览器控制台使用console.log(this.readyState)debugger; 时,基本调试向您展示了什么?
  • 你看过documentationreadyState 吗?你做过什么类型的调试?

标签: javascript ajax xmlhttprequest


【解决方案1】:

好吧,我用 readyState 2 不知何故让它工作了。谢谢大家,很抱歉浪费了你们的时间。

解决方案代码如下

var postPlaceFormIsOpen = 0;
function postPlacesForm() {
    var yhteys = new XMLHttpRequest();
    yhteys.onreadystatechange = function() {
        if(this.readyState === 2) {
            if(postPlaceFormIsOpen === 0) {

            }
         else {
            yhteys.abort();
            console.log("test");
            document.getElementById("places").style.display = "block";
            document.getElementById("ajax_close").style.dispaly = "block";
        }
    }
    if(this.readyState === 4 && this.status === 200) {
        document.getElementById("places").innerHTML = this.responseText;
        document.getElementById("places").style.display = "block";
        document.getElementById("ajax_close").style.display = "block";
        postPlaceFormIsOpen++;
        console.log(postPlaceFormIsOpen);
    }

};
yhteys.open("POST", "/js/ajax_inc/forms/postplaces.php", true);
yhteys.send();

}

【讨论】:

    【解决方案2】:

    看来您还不了解readyState 属性。

    • 0 未发送客户端已创建。 open() 尚未调用。
    • 1 OPENED open() 已被调用。
    • 2 HEADERS_RECEIVED send() 已被调用,并且标头和状态可用。
    • 3 LOADING 下载; responseText 保存部分数据。
    • 4 DONE 操作完成。

    https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多