使用 XMLHTTPRequest 根据 php 响应更改变量

Use XMLHTTPRequest to change variable based on php response

我正在尝试编写一个从 select 框中删除元素的函数,但前提是该元素未用于其他用途。例如,如果 select 框有一个学生姓名列表,它会首先检查学生姓名是否正在某处使用(或存储在数据库中)。检查脚本只是回显 "true" 或 "false",具体取决于名称是否正在使用。如果不再使用该名称,则继续将其删除。否则,它会提醒您。

function removeListItem(selectBox, value)
{
  var removed = 0;
  for (var x = 0; x < selectBox.options.length; x++) {
    if (selectBox.options[x].value == value) {
      var formdata = new FormData();
      var check = "false";
      formdata.append('number', value);
      var ajax = new XMLHttpRequest();
      ajax.open("POST", "check.php");
      ajax.send(formdata);
      ajax.onreadystatechange = function() {
        if (ajax.readyState == 4 && ajax.status == 200) {
          check = ajax.reponseText;
          if (check == "true") {
            alert("You have selected a number in use!");
          }
        }
      }
      if (check == "false") {
        selectBox.remove(x);
        removed = 1;
      }
    }
  }
  return removed;
}

问题是它几乎从不运行检查(根据我的观察),所以当我试图删除我不应该删除的东西时永远不会发出警报。

我认为这与同步与异步有关javascript,所以我想知道我应该怎么做才能获得所需的功能。

我想 return 删除,因为它在我调用 removeListItem 时被添加到计数器中。我想要一个计数器,因为 selectBox 允许同时移除多个,所以我会跟踪每个移除。

是的,你是对的。 尝试在 onreadystatechange 回调中移除 dom 元素。

并且您的函数应该return 承诺处理异步请求。因为函数调用会在 XMLHttpRequest 之前完成。

function removeListItem(selectBox, value)
  {
      var promise = new Promise(function(resolve, reject) {
        var removed = 0;
        for (var x = 0; x < selectBox.options.length; x++)
        {
          if(selectBox.options[x].value == value)
          {
            var formdata = new FormData();
            var check = "false";
            formdata.append('number', value);
            var ajax = new XMLHttpRequest();
            ajax.open("POST", "check.php");
            ajax.send(formdata);
            ajax.onreadystatechange = function() 
            {
              if (ajax.readyState == 4 && ajax.status == 200) 
              {
                check = ajax.reponseText;
                if(check == "true")
                {
                  alert("You have selected a number in use!");
                  reject();
                } 
                else 
                {
                  selectBox.remove(x);
                  removed = 1;
                  resolve(removed);    
                }
              }
            }
          }
        }
      });

      return promise;
  }

要使用此功能,请调用

removeListItem(selectBox, 1).then(function(removed){ 
  // removed successful
}).catch(function() {
  // doesn't removed
});