我有一个表正在使用 ajax 进行验证,返回的结果为 true,我还设置了一个全局标志,如果该表的验证为 true,则应启用所有其他表的复选框也一样,但由于某种原因它不起作用,我不知道为什么。通过验证的表正在运行“tabCSite1”和“tabCEquip1”,其中它的复选框已启用,但对于其他类型表则不起作用。这是代码:
function getDetailsCheckJob(data, typetable, checkboxname,t) {
var tblC = document.getElementById(typetable);
for (var i = tblC.rows.length - 1; i > 0; i--) {
tblC.deleteRow(i);
}
Row = data.split('[');
var tab = document.getElementById(typetable);
var valid_asb = false;
var valid_FTTH = false;
var tabCSite1Valid = false;
for (var p = 0; p < Row.length - 1; p++) {
var row = tab.insertRow(p + 1);
row.style.background = "#e8eef4";
row.style.whiteSpace = "nowrap";
splitData = Row[p + 1].split('|');
if (splitData[0] == "Y") {
row.insertCell(0);
tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" checked/>"; //checked
}
else if (splitData[0] == "N") {
row.insertCell(0);
tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\"/>";
}
if (typetable == "tabCEquip1") {
checkValidation(splitData[2], splitData[28], splitData[29], t, jobID, function (resp) {
valid_asb = resp.isASBExist;
valid_FTTH = resp.isFTTHExist;
});
}
else if (typetable == "tabCSite1") {
checkValidation(splitData[2], splitData[23], splitData[29], t, jobID,function (resp) {
valid_asb = resp.isASBExist;
valid_FTTH = resp.isFTTHExist;
tabCSite1Valid = valid_FTTH; // Update the global flag here
console.log('tabCSite1Valid inside: ', tabCSite1Valid);
});
}
var splitDatalen = splitData.length;
if (typetable == "tabCEquip1" || typetable == "tabCSite1") {
splitDatalen = splitDatalen - 3;
}
else {
splitDatalen = splitDatalen - 1;
}
for (var i = 1; i < splitDatalen; i++) {
console.log('tabCSite1Valid inside other one: ', tabCSite1Valid);
//alert(splitData.length);
row.insertCell(i);
styleData = splitData[i + 1];
if (typetable == "tabCEquip1" || typetable == "tabCSite1" || typetable == "tabCSBoundary1" || typetable == "tabLPcomm1" || typetable == "tabAddCardSplit1" || typetable == "tabDelEquip1" || typetable == "tabDelPath1" || typetable == "tabDelSB1" || typetable == "tabCPathConsumer1" || typetable == "tabCreateServiceOLT1") {
if (tabCSite1Valid == false) {
tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
console.log('Activated at FTTH');
}
if (splitData[3] != "ASB" && valid_asb == true) { //else && valid_FTTH == false
tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
console.log('Activated at ASB');
}
}
tab.rows[p + 1].cells[i].innerHTML = styleData;
}
}
}
问题是最后一个的 for 循环,表 tabCEquip1 和 tabCSite1 的“tabCSite1Valid”为 true。我什至将其设置为全局,但它仍然不适用于所有其他表。我哪里出了问题以及如何解决?
包含
for loop
条件检查的 tabCSite1Valid
可能会在 checkValidation
完成处理之前执行。这意味着当 tabCSite1Valid
检查其值时,false
仍然是 loop
,即使稍后它会更新为 true
。
也许当您将
loop
移动到checkValidation
的回调函数中时,它会解决您的问题。这确保了 loop
在函数完成处理后执行。
修改了该部分的代码;
if (typetable == "tabCSite1") {
checkValidation(splitData[2], splitData[23], splitData[29], t, jobID,function (resp) {
valid_asb = resp.isASBExist;
valid_FTTH = resp.isFTTHExist;
tabCSite1Valid = valid_FTTH; // Update the global flag here
console.log('tabCSite1Valid inside: ', tabCSite1Valid);
// Move the for loop inside the callback function
for (var i = 1; i < splitDatalen; i++) {
console.log('tabCSite1Valid inside other one: ', tabCSite1Valid);
//alert(splitData.length);
row.insertCell(i);
styleData = splitData[i + 1];
if (typetable == "tabCEquip1" || typetable == "tabCSite1" || typetable == "tabCSBoundary1" || typetable == "tabLPcomm1" || typetable == "tabAddCardSplit1" || typetable == "tabDelEquip1" || typetable == "tabDelPath1" || typetable == "tabDelSB1" || typetable == "tabCPathConsumer1" || typetable == "tabCreateServiceOLT1") {
if (tabCSite1Valid == false) {
tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
console.log('Activated at FTTH');
}
if (splitData[3] != "ASB" && valid_asb == true) { //else && valid_FTTH == false
tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
console.log('Activated at ASB');
}
}
tab.rows[p + 1].cells[i].innerHTML = styleData;
}
});
}
上面的代码确保
loop
仅在checkValidation
完成处理后执行,这应该允许当tabCSite1Valid
检查其值时,true
为for loop
。
此外,如果您需要在 checkValidation
之外使用
for 循环,您可能需要重构代码以处理
checkValidation
函数的异步性质。这可能涉及使用 Promises 或 async/await 来处理异步操作。