javascript - DOM 元素更改在 JavaScript 代码中不可见

标签 javascript dom

setTimeout( function () {
    ajaxLoadFormHeader("A", nRequest_ID, nJeppesen_Number); 
    ajaxLoadFormHeader("B", nRequest_ID, nJeppesen_Number);

    spinner.stop();

    if (document.getElementById("txt_A_Primary_Permits").checked ) {
        showRouting("A");
    }

    if (document.getElementById("txt_B_Primary_Permits").checked ) {
        showRouting("B");
    }
}, 500);

该页面有两个 div,分别保存我们正在使用的 A 和 B 路由信息。我通过隐藏一个并通过单击按钮显示另一个来在它们之间切换。

ajaxLoadFormHeader() 函数将数据从服务器加载到每个 header 表单上的文本和复选框元素中。

调用 ajaxLoadFormheader() 后,我查看每个表单中的复选框元素,并根据选中的元素显示路由 div 并隐藏另一个。

问题就在这里。紧随 ajaxLoadFormHeader() 函数返回后,当我检查复选框元素的“.checked”状态时,它们也没有反射(reflect) ajaxLoadFormHeader() 刚刚设置的更改。在 ajaxLoadFormHeader() 调用结束时,这些值没有改变。

我怀疑这个问题与代码如何更改 DOM 值有关,并且直到当前代码块关闭之前更改才完成并生效。换句话说,也许 DOM 的变化在 setTimeout() 函数完成之前是不可见的?

具体:调用 ajaxLoadFormHeader() 函数后,即使它实际上设置了其中一个复选框的选中状态,即 (txt_A_Primary_Permits.checked) 和 (txt_B_Primary_Permits.checked)返回 false - 即使表单加载并显示选中的框。

注意:这不是全部代码。有代码用于检测两个复选框是否都未被选中,或处理两个复选框都被选中的错误情况。我只提供了相关代码供您查看问题。

最佳答案

AJAX 中的第一个 A 代表异步。如果您的请求确实是异步的,则意味着您的代码在后台执行请求时继续运行。这意味着旋转器已停止,并且在请求仍然繁忙时评估 ifs,因此复选框的状态尚未更新。

解决此问题的正确方法是将回调或事件处理程序附加到请求完成时调用的请求。现在,确切的细节取决于您实现 ajaxLoadFormHeader 的方式,因此很难提供它们,但希望这些信息至少能帮助您找到正确的解决方案。

一个好的起点是 this question ,这是通过使用 onreadystatechange 事件的“普通”JavaScript AJAX 示例来回答的。

关于javascript - DOM 元素更改在 JavaScript 代码中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27514399/

相关文章:

javascript - 如何将参数传递给promise函数

javascript - 在 google maps api v3 中完成多边形绘制时的处理

javascript - 当我点击特定元素时如何找到text()?

php - 在 PHP 中访问 javascript DOM 对象

javascript - 外行术语中的 Unobtrusive Javascript 是什么?

javascript - 通过 JS 正则表达式从字符串中检索数字

javascript - 如何禁用 react 选择上的输入?

javascript - 如何在纯JS中的一行后插入一组表行

javascript - JS : Check if text is exceeding container width

javascript - 无法使用 javascript 获取属性的值