使用 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
});
我正在尝试编写一个从 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
});