Php 我在AJAX中遇到了一个问题

Php 我在AJAX中遇到了一个问题,php,javascript,ajax,Php,Javascript,Ajax,我的一些验证代码有问题。给你 function isEmailValid(email) { if( email == "") { document.getElementById("emailMsg").innerHTML="<font color=red>Email cannot be empty</font>"; } else { var emailRegexStr = /^[a-zA-Z0-9._-]+@

我的一些验证代码有问题。给你

function isEmailValid(email) {
    if( email  == "") {
        document.getElementById("emailMsg").innerHTML="<font color=red>Email cannot be empty</font>";  
    }
    else { 
        var emailRegexStr = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; 
        if (!emailRegexStr.test(email)) { 
            document.getElementById("emailMsg").innerHTML="<font color=red>Invalid email</font>";   
        }
        else {
            xmlhttp = getHTTPObject();
            xmlhttp.onreadystatechange = function() {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
                    document.getElementById("emailMsg").innerHTML = xmlhttp.responseText; 
                    if(xmlhttp.responseText == "<font color=green>Correct !</font>" ) {
                        return true;
                    }
                    else {
                        return false;
                    }      
                }
            }

            xmlhttp.open("GET","includes/register_function.php?email="+email,true);   
            xmlhttp.send();
        }
    }
}
}

我需要知道如何更改同步场景的getHTTPObject函数


谢谢。

您依赖于与任意字符串匹配的字符串-这通常容易出错。最有可能的是在响应中有一个拖尾回车

试着做:

alert('[' + xmlhttp.responseText +']');
代替你的if语句

如果警报值不准确

[<font color=green>Correct !</font>]
或者更好的做法是:

return (xmlhttp.responseText.indexof("Correct")>=0);

您是否希望
isEmailValid()
返回
true
false
?因为它的书写方式不会返回任何结果。在
isValidEmail()
中定义的嵌套函数返回
true
false
,但在
isValidEmail()
完成执行后,将异步调用该函数。而且它不会被你的代码调用。它会被浏览器调用,因此您可能永远不会有机会检查返回值以检查它是
true
还是
false

更改代码以实现让
isValidEmail()
返回
true
false
的目标的一种方法是使
XMLHttpRequest
调用同步,而不是异步(SJAX而不是AJAX)。这样,
isValidEmail()
将阻塞,直到收到服务器的响应(或超时)。当然,当用户等待验证其电子邮件地址时,他们将无法在页面上执行任何操作。这可能是可以接受的,也可能是不可以接受的


另外,正如其他人所指出的,正则表达式和字符串匹配可能需要一些调整,但从问题来看,这并不是你要问的问题。

我建议在PHP和javascript中使用更好的东西。与此类似,PHP脚本可以将结果输出为XML或JSON。客户端的Javascript将根据格式解析字符串

我建议您查看以下链接: 对于JSON(我个人更喜欢JSON而不是XML,在某些方面JSON比XML好得多)

对于XML,简单地说是google,我相信你会得到很多结果

例如: 在PHP中:

在Javascript中:

try{
    var result = JSON.parse(xmlhttp.responseText);
}catch(err){
    alert("...");
}

这个正则表达式会说很多完全有效的电子邮件地址都是无效的。我还要说你的代码非常脆弱——如果有人改进服务器以返回格式更好的html,会发生什么?正确或移动间距等?ajax部分检查电子邮件是否已在数据库中可用,并回显该值,以便在(xmlhttp.responseText==“Correct!”)为真时完成整个验证,否则它已在数据库中。这是注册表中的验证部分。
正确!
是“地址不在数据库中”的代码吗?哦,天哪,我并不是说这不是一张有效的支票,这绝对是。我只是说你这样做可能会给你带来很多问题。如果您可以检查响应文本是否包含单词
Correct
,为什么还要尝试精确匹配响应文本。。。也就是说,我认为Asah的答案就是你想要得到的好结果——我没有发现他是从一个异步函数返回的。当我得到更多的选票时,我将+1:)是的,我理解你的观点。处理这种异步情况的任何想法都要使调用同步,而不是异步。您必须更改XMLHttpObject代码。我是这方面的新手。您能告诉我如何更改getHTTPObject()函数吗。代码已附加到邮件。。。
[<font color=green>Correct !</font>]
[<font color=green>Correct !</font>
]
if(xmlhttp.responseText.indexof("Correct")>=0) {
    return true;
} else {
    return true;
}
return (xmlhttp.responseText.indexof("Correct")>=0);
$obj['result'] = 1;
$obj['color'] = 'green';
echo json_encode($obj);
try{
    var result = JSON.parse(xmlhttp.responseText);
}catch(err){
    alert("...");
}