问题描述
这是当前的源代码:
makefile
尝试了很多方法来主要使用 SO anwsers 来传递它们,每次 var xhttp = new XMLHttpRequest();
function passVars(var1,var2,var3) {
if (var1.readyState == 4) {
if (var1.status == 200) {
var data = var1.responseText;
if (data) {
playSuccess();
classSwitch(data,var3);
} else {
playFailure();
alert("Error: returned status code " + var1.status + " " + var1.statusText);
}
}
}
}
xhttp.onreadystatechange = function() {
passVars(xhttp,"tab","p1234");
};
xhttp.open("POST","index.PHP",true);
xhttp.send(formData); //formdata is a POST send to PHP's backend which returns responseText = 0 or 1 for var data
function classSwitch(state,sOrigin,stateButtonID) {
if (sOrigin === "tab") {
Monitored = state;
if (state === "1") {
if (document.getElementById("setmonitoring").classList.contains("productmonitoringdisabled")) {
document.getElementById("setmonitoring").classList.remove("productmonitoringdisabled");
}
document.getElementById("setmonitoring").classList.add("productmonitoringenabled");
}
if (state === "0") {
if (document.getElementById("setmonitoring").classList.contains("productmonitoringenabled")) {
document.getElementById("setmonitoring").classList.remove("productmonitoringenabled");
}
document.getElementById("setmonitoring").classList.add("productmonitoringdisabled");
}
}
if (sOrigin === "issues") {
if (state === "1") {
if (document.getElementById(stateButtonID).classList.contains("productmonitoringdisabled")) {
document.getElementById(stateButtonID).classList.remove("productmonitoringdisabled");
} else document.getElementById(stateButtonID).classList.add("productmonitoringenabled");
}
if (state === "0") {
if (document.getElementById(stateButtonID).classList.contains("productmonitoringenabled")) {
document.getElementById(stateButtonID).classList.remove("productmonitoringenabled");
} else document.getElementById(stateButtonID).classList.add("productmonitoringdisabled");
}
}
}
和 var2
都是 var2
。这用于库存控制系统,早期 alpha 版本。思路是在后端返回产品当前监控状态时,传递元素的id来改变按钮类
任何想法如何传递这些变量?提前致谢
解决方法
以下是如何将参数传递给 onreadystatechange
回调函数的最小示例。你把它搞得有点过于复杂了——没有必要将你的 xhttp
变量传递给回调,因为它已经在作用域中可用了。
const xhr = new XMLHttpRequest();
xhr.open("GET","https://developer.mozilla.org/");
xhr.send();
xhr.onreadystatechange = function() {
callback("tab","1234");
};
function callback(var1,var2) {
console.log(`var1 = ${var1}`);
console.log(`var2 = ${var2}`);
//Do your xhr.readyState and xhr.status checks in this function
console.log(`xhr.readyState = ${xhr.readyState}`);
console.log(`xhr.status = ${xhr.status}`);
}
你的结构不好。你不能在异步调用中像那样传递 xhttp 。直接改成这样...
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
var data = xhttp.responseText;
if (data) {
playSuccess();
classSwitch(data,'tab','1234');
} else {
playFailure();
alert("Error: returned status code " + xhttp.status + " " + xhttp.statusText);
}
}
}
};