javascript - 长 JavaScript 函数末尾的 CSS 元素更新

标签 javascript css ajax

我正在运行一个 js 函数,该函数使用 ajax 查询 ldap 服务器以检索多个用户信息并输入到 mysql 数据库。这是通过每次循环使用不同参数的 ldap 请求来完成的。

因为 ldap 服务器响应缓慢,所以我添加了一个进度条。每次查询完成时,都会触发进度条的更新。问题是进度条只在整个函数完成后更新一次,即使 CSS 更新发生在循环开始之前也是如此。

function findUsers() {
  //set Number of users
  var noOfUsers = 10;
  var progress = 1;

  //progress bar div appears as soon as function begins
  //this element change doesn't happen till the function has finsihed
  document.getElementById('progress_bar').style.visibility = 'visible';


  //loop through users
  for (counter = 0; counter <= noOfUsers; counter++) {
    //update element with progress
    document.getElementById('progress_bar').innerHTML = progress + " of " + noOfUsers;

    //start AJAX
    xhrPostUserIDToLDAP = new XMLHttpRequest();
    xhrPostUserIDToLDAP.onreadystatechange = function () {
      if (xhrPostUserIDToLDAP.readyState == 4 && xhrPostUserIDToLDAP.status == 200) {
        //updates progress var so on next loop, the element is updated
        progress++;
      }
    }
    xhrPostEmployees.open("POST", "ajax/ldap.php", false);
    xhrPostEmployees.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhrPostEmployees.send("userID=" + userID);
  }
  //loop has finsihed, update element with complete notification
  document.getElementById('progress_bar').innerHTML = "Completed";
}

唯一更新元素的是 Completed,但这会在函数完成后 20 秒后发生。

如何在循环中更新元素?

最佳答案

这里的问题是您正在快速循环并发出 10 个异步请求。每次执行循环时,它都会使用 progress 设置 progress_bar。由于回调尚未触发或从服务器返回,progress 始终等于 1。要解决此问题,您需要输入:

document.getElementById('progress_bar').innerHTML = progress + " of " + noOfUsers;  

在您执行 progress++ 之后,在您的 onreadystatechange 回调中。这确保在每个异步请求返回到服务器后,您更新 progress_bar

关于javascript - 长 JavaScript 函数末尾的 CSS 元素更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644522/

相关文章:

javascript - 解释一下下面的 JavaScript 语句?

javascript - Bootstrap 选项卡选项卡 ('show' ) 拒绝工作

javascript - 找出在 Backbone Marionette 应用程序中执行 GET 的代码

javascript - 为什么轮询在闲置一段时间后停止工作?

javascript - 如何使用 jQuery forEach 语句?

javascript - window.pageYOffset 返回不准确的值

具有特定类的最后一个 div 的 css 选择器

css - 声明中的选择器?

node.js - 使用 i18n 和 ejs 进行客户端渲染

javascript - 在 Liferay 7.2 中实现自动保存网页内容为草稿