javascript - 为什么不能分离 xmlHttp.onreadystatechange 的函数?

标签 javascript ajax onreadystatechange

下面的js文件test.js`在我的html中工作正常。

function sendData()
{
    var formData = new FormData( document.querySelector("form") );
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("post", "test.php",true); 
    xmlHttp.send(formData); 
    xmlHttp.onreadystatechange =  function(){
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200){ 
        alert(xmlHttp.responseText);
    }
}
}

ob = document.getElementById("submit"); 
ob.addEventListener("click",sendData);

现在我想把它们分开

        if (xmlHttp.readyState == 4 && xmlHttp.status == 200){ 
        alert(xmlHttp.responseText);

在单个函数中。

我将 test1.js 重写为 test2.js。

var xmlHttp;
function ready(){        
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200){ 
        alert(xmlHttp.responseText);
        }
}

function sendData()
{
    var formData = new FormData( document.querySelector("form") );
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("post", "test.php",true); 
    xmlHttp.send(formData); 
    xmlHttp.onreadystatechange =  ready;
}

ob = document.getElementById("submit"); 
ob.addEventListener("click",sendData);

test2.js遇到错误信息:

test2.js:4 Uncaught TypeError: Cannot read property 'readyState' of undefined
    at XMLHttpRequest.ready (test2.js:4)

另一个问题:以下语句的正确顺序是什么?
我看到一些 Material 写如下:

    xmlHttp.open("post", "test.php",true); 
    xmlHttp.send(formData); 
    xmlHttp.onreadystatechange =  function(){  }

还看到其他 Material :

    xmlHttp.onreadystatechange =  function(){  }
    xmlHttp.open("post", "test.php",true); 
    xmlHttp.send(formData); 

网页中的其他订单xmlHttp statements order

xmlhttp.open("POST", "Demo", true);
xmlhttp.onreadystatechange=myCallBack;
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
xmlhttp.send("FirstName=Nat&LastName=Dunn");

最佳答案

sendData 中,您有:

var xmlHttp = new XMLHttpRequest();

您唯一的错误是在此处包含 var - 只需这样做:

xmlHttp = new XMLHttpRequest();

这很重要的原因是 var 正在声明一个同名的新局部变量,然后该变量被分配给 - 所以 ready 无法访问到它。它访问从未分配过的全局 xmlHttp 变量。通过删除如上所示的 var,您可以确保将全局变量分配给 - 并且这应该可以工作。 (尽管使用全局变量当然不是最佳实践。)

关于javascript - 为什么不能分离 xmlHttp.onreadystatechange 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53457706/

相关文章:

javascript - 循环中的onreadystatechange,readystate改变太晚了

ajax 就绪状态达到 4 但状态始终为 200

javascript - XMLHttpRequest onreadystatechange readyState 1 和 2 之间的长延迟

javascript - 在对象上有一个单独的初始化函数有什么好处?

javascript - 如何使用事件处理程序连续循环遍历数组列表(从末尾恢复到开头)

javascript - Chrome 和 Firefox POST 调用的内容类型差异

javascript - 在浏览器中禁用 javascript 会影响 ajax 调用和 js 功能

php - 制作下一步按钮以获得更多更多数据?

javascript - 如何将 .txt 字符串转换为 basil.js 中的变量?

javascript - 获取具有子数组 json 值的数组的值