1

我将从我正在尝试做的事情开始。

我创建了一个“忘记密码”系统,用户可以在其中输入他们的电子邮件地址,并且(如果正确)他们将收到一封带有重置链接的电子邮件。

表单页面中有一小部分 ajax 用于检测输入的电子邮件是否在数据库中。如果数据库中确实存在电子邮件,则表单将颜色更改为绿色并启用提交按钮。如果未检测到电子邮件,表单将保持红色并且提交按钮被禁用。

在此处输入图像描述

问题是当输入电子邮件地址时,keyup 事件似乎发生在用户输入的字符比正确的电子邮件多一个字符时(基本上如果hello@123.com在我的数据库中,他们将不得不输入hello@123. com1用于启用提交)

这是我的 JSFiddle,除了 ajax 工作之外的所有内容。

以下是 ajax 文件本身的示例:

<?php

session_start();

$Email = $_POST['email'];

//Parse ini file containing database information
$databaseInfo = parse_ini_file("optiMizeWebReport.ini", true);

global $con;

//Connect to database
$con = @mysqli_connect($databaseInfo['optiMizeDatabaseConnection']    ['WebServer'],$databaseInfo['optiMizeDatabaseConnection']['Username'],     $databaseInfo['optiMizeDatabaseConnection']['Password'],     $databaseInfo['optiMizeDatabaseConnection']['DBName']);

//Check connection and output error if invalid
if(!$con)
{
    die('Connect Error ('. mysqli_connect_errno() .') '.mysqli_connect_error());
}

//Execute query
$result = mysqli_query($con, "SELECT COUNT(*) FROM login WHERE Email='$Email'")
or die("Error: ".mysqli_error($con));

//Initialize
$emailMatch = array();

//Extract
while($emailMatch[] = mysqli_fetch_array($result))


print_r($emailMatch[0][0]);

?>

如果有任何其他信息可以提供帮助,请告诉我。谢谢。

编辑:

由于似乎仍然没有快速修复/答案,我制作了一个简短的视频,准确显示发生了什么。你可以在这里看到它:https ://www.youtube.com/watch?v=P-2Gz5b4ek8

4

3 回答 3

2

Ajax 请求是异步的!在您的情况下,当您检查if(databaseCheck != 1)的值databaseCheck是先前的 ajax 响应时。这就是为什么您必须输入 1 个额外字符才能获得最后一个结果。

$('input').bind("keyup", function() {
    $.ajax({
           type: "POST",
           url: "ForgotPasswordAjax.php",
           data: {email: $('#email').val()},
           success: function(output){
               console.log(output);
               notification(output);
           }
    });
});
function notification(databaseCheck) {
    if (databaseCheck != 1) {
        ....
    } else {
        ....
    }
}

在成功部分调用这样的函数,它将确保这些代码将在 ajax 成功后运行。它将解决您当前的问题,但您必须防止同时进行 ajax 调用。我们不知道哪个请求首先返回,如果第一个请求响应最后一个 js 将使用该响应设置通知。所以你必须添加一个处理标志来防止它。

于 2013-10-30T12:36:51.880 回答
0

我已经更新了JsFiddle

在这里,我已将 keydown 和焦点包含在

$('#email').bind("keyup keydown change focus blur", function() {

并更改以下行

 $('input').bind("keydown", function() {
于 2013-10-30T09:49:54.770 回答
0

jQuery 有另一个名为input.

$('#email').bind("input", function() {

更新了 jsFiddle

于 2013-10-30T10:26:10.497 回答