【问题标题】:Use XMLHTTPRequest to change variable based on php response使用 XMLHTTPRequest 根据 php 响应更改变量
【发布时间】:2016-01-14 15:50:38
【问题描述】:

我正在尝试编写一个从选择框中删除元素的函数,但前提是该元素未用于其他用途。例如,如果选择框有一个学生姓名列表,它首先检查学生姓名是否在某处使用(或存储在数据库中)。检查脚本会根据名称是否在使用中简单地回显“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 有关,所以我想知道我应该怎么做才能获得所需的功能。

我想返回已删除,因为当我调用 removeListItem 时它被添加到计数器中。我想要一个计数器,因为 selectBox 允许同时进行多次删除,所以我会跟踪每次删除。

【问题讨论】:

  • 您的(check == "false") if 语句没有括号,因此removed = 1; 不在该条件范围内,并且每次都会被调用。
  • 是的,我解决了这个问题。谢谢。 (不过,它并没有真正改变所需的功能)。
  • 在您的check.php 文件中发布相关代码也可能会有所帮助
  • 我认为就 php 文件的处理方式而言,无需担心太多。这是一个简单的mySQL数据库查找,然后我只是简单地回显“true”或“false”,如果我没记错的话应该由responseText拾取。

标签: javascript php ajax xmlhttprequest


【解决方案1】:

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

你的函数应该返回promise来处理异步请求。因为函数调用会在 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
});

【讨论】:

  • 我对函数的用法有点困惑。这将如何在代码中工作?
  • 我更新了答案,有点忘了真正正确的呼叫功能;)
  • 因此,您的函数返回 Promise,这有助于处理异步代码。它为您提供基本的两种方法 .then(callback) 和 .catch(callback)。当异步流程成功完成时,将调用 .then() 的回调。
猜你喜欢
  • 2016-01-09
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多