gpt4 book ai didi

Javascript 和 AJAX,仅在使用 alert() 时有效

转载 作者:数据小太阳 更新时间:2023-10-29 03:49:00 26 4
gpt4 key购买 nike

我的 javascript 有问题。它似乎表现得很奇怪。这是怎么回事。我有一个表单,在用户提交后,它会调用一个函数(onsubmit 事件)来验证提交的数据,如果出现问题或者用户名/电子邮件已经在数据库中(这部分使用 ajax),它将返回 false并使用 DOM 显示错误。这是下面的代码。奇怪的是,它只在我使用空的 alert('') 消息时起作用,没有它,它就不起作用。感谢您的帮助。

//////////////////////////////////////

function httpRequest() {
var xmlhttp;

if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else if (window.ActiveXObject) {
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
} else {
alert("Your browser does not support XMLHTTP!");
}

return xmlhttp;
}

function validateRegForm(reg) {

var isValidForm = true;
var warningIcon = "";//for later in case we want to use an icon next to warning msg

with(reg) {


var regFormDiv = document.getElementById("registration_form");

//Check if dynamic div exist, if so, remove it
if(document.getElementById('disp_errors') != null) {
var dispErrorsDiv = document.getElementById('disp_errors');
document.getElementById('reg_form').removeChild(dispErrorsDiv);
}

//Dynamically create new 'div'
var errorDiv = document.createElement('div');
errorDiv.setAttribute('id','disp_errors');
errorDiv.setAttribute('style','background-color:pink;border:1px solid red;color:red;padding:10px;');
document.getElementById('reg_form').insertBefore(errorDiv,regFormDiv);




var xmlhttp = httpRequest();
var available = new Array();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4)
{
var response = xmlhttp.responseText;
if(response != "") {

//Return values
var newValue = response.split("|");
available[0] = newValue[0];
available[1] = newValue[1];
}
}
}

xmlhttp.open("GET","profile_fetch_reg_info.php?do=available&un="+u_username.value+"&email="+u_email.value+"",true);
xmlhttp.send(null);


alert(' '); ////////////WITHOUT THIS, IT DOESN'T WORK. Why?

if(available[1] == "taken") {
errorDiv.innerHTML += warningIcon+'Username is already taken!<br />';
isValidForm = false;
} else if(u_username.value.length < 4){
errorDiv.innerHTML += warningIcon+'Username must be more than 4 characters long!<br />';
isValidForm = false;
} else if(u_username.value.length > 35) {
errorDiv.innerHTML += warningIcon+'Username must be less than 34 characters long!<br />';
isValidForm = false;
}


if(available[0] == "taken") {
errorDiv.innerHTML += warningIcon+'Email address entered is already in use!<br />';
isValidForm = false;
} else if(u_email.value == ""){
errorDiv.innerHTML += warningIcon+'Email address is required!<br />';
isValidForm = false;
} else {
//Determine if email entered is valid
var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (!filter.test(u_email.value)) {
errorDiv.innerHTML += warningIcon+'Email entered is invalid!<br />';
u_email.value = "";
isValidForm = false;
}
}


if(u_fname.value == ""){
errorDiv.innerHTML = warningIcon+'Your first name is required!<br />';
isValidForm = false;
}

if(u_lname.value == ""){
errorDiv.innerHTML += warningIcon+'Your last name is required!<br />';
isValidForm = false;
}



if(u_password.value.length < 4){
errorDiv.innerHTML += warningIcon+'Password must be more than 4 characters long!<br />';
isValidForm = false;
} else if(u_password.value.length > 35) {
errorDiv.innerHTML += warningIcon+'Password must be less than 34 characters long!<br />';
isValidForm = false;
} else if (u_password.value != u_password2.value) {
errorDiv.innerHTML += warningIcon+'Password and re-typed password don\'t match!<br />';
isValidForm = false;
}


if(u_squestion.value == ""){
errorDiv.innerHTML += warningIcon+'A security question is required!<br />';
isValidForm = false;
}

if(u_sanswer.value == ""){
errorDiv.innerHTML += warningIcon+'A security answer is required!<br />';
isValidForm = false;
}

if(u_address.value == ""){
errorDiv.innerHTML += warningIcon+'Address is required!<br />';
isValidForm = false;
}

if(u_city.value == ""){
errorDiv.innerHTML += warningIcon+'City is required!<br />';
isValidForm = false;
}

if(u_state.value == ""){
errorDiv.innerHTML += warningIcon+'State is required!<br />';
isValidForm = false;
}

if(u_zip.value == ""){
errorDiv.innerHTML += warningIcon+'Zip code is required!<br />';
isValidForm = false;
}

if(u_phone.value == ""){
errorDiv.innerHTML += warningIcon+'Phone number is required!<br />';
isValidForm = false;
}

if(isValidForm == false)
window.scroll(0,0);

return isValidForm;
}

}

最佳答案

alert() 有帮助,因为它延迟了该函数中剩余 javascript 的处理(从 alert() 到底部的所有内容),留下足够的时间用于完成 AJAX 请求。 AJAX 中的第一个字母代表“异步”,这意味着(默认情况下)响应将在“ future 的某个时间点”出现,但不会立即出现。

一个解决方法(您不应该实现)是使处理同步(通过将 open() 的第三个参数更改为 false) 这将停止进一步处理您的脚本(和整个网页),直到请求返回。这很糟糕,因为它会有效地卡住 Web 浏览器,直到请求完成。

正确的解决方法是重构您的代码,以便任何依赖于 AJAX 请求结果的处理都进入 onreadystatechange 函数,而不能在启动AJAX 请求。

通常处理此问题的方法是修改您的 DOM(在发送 AJAX 请求之前)使表单只读并显示某种“处理中”消息,然后在 AJAX 响应处理程序中,如果一切正常(服务器正确响应并且验证成功)在表单上调用submit(),否则使表单再次可写并显示任何验证错误。

关于Javascript 和 AJAX,仅在使用 alert() 时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1267454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com