0

我有一个由 ajax 脚本调用的 mail.php 文件。为了完整起见,下面附上了 ajax 脚本。mail.php 文件所做的只是执行一些服务器端验证,如果一切顺利,则发送一封电子邮件,其中包含mail()从 ajax 请求发送的数据。

我想要做的是根据请求的响应执行一些额外的 javascript 操作。您可以看到,在当前状态下,请求的响应只是简单地回显到屏幕上,这很好。但现在我想根据响应修改 HTML 元素。

例如,假设如果邮件已发送,我想在页面上附加一个名为“OK”的图像,如果邮件未发送,我想在页面上附加一个名为“FALSE”的图像。我想做的(在伪代码中)是这样的:

if ( request is OKAY ) $('.contact').append('<img src"OK"');
else ( $('.contact').append('<img src="BAD''); 

有什么办法可以做到这一点?

谢谢!

ajax 脚本如下所示:

$('.submit').click(function() {
    $('div.load').html('<img src="images/load.gif" alt="Loading..." id="loading" />'); 

    //creation of variables to send
    var name = $('#name').val();
        email = $('#email').val();
        phone = $('#phone').val();

    $.ajax({
        url: 'mail.php',
        type: 'POST',
        data: 'name=' + name + '&email=' + email + '&phone=' + phone,

        success: function(result) {
            $('p.error,p.correct').remove();
            $('.contact').append(result);
            $('#loading').fadeOut(500, function() {
                $(this).remove();
            });

        }
    });

    return false; 
});
4

3 回答 3

3

假设您的 PHP 以文本“OKAY”响应:

if (result==="OKAY")
   $('.contact').append('<img src"OK" />');
else
   $('.contact').append('<img src="BAD" />');

或者:

$('.contact').append('<img src"' + (result==="OKAY"?'OK':'BAD') + '" />');

另一种方法是更新您的 PHP,使其返回包含消息和图像的 html,例如,成功时它可以返回:

Your request was successful. <img src="OK" />

“我应该提一下,我也想保留当前的响应,以确保非 JS 用户也能收到适当的消息”

非 JS 用户不会得到任何东西,因为您的 Ajax 代码使用 JS...

于 2012-06-04T21:03:32.160 回答
1

这就是 AJAX 调用初始化中成功/错误对象的目的。您需要添加三个失败案例。前两个失败案例将通过successajax 调用出现,都是由于服务器端问题。第二个错误情况是在errorajax 调用的情况下。此外,您的 Web 服务应该返回一个成功参数。将您的代码更改为类似这样以实现您所描述的内容:

$('.submit').click(function() {
    $('div.load').html('<img src="images/load.gif" alt="Loading..." id="loading" />'); 

    //creation of variables to send
    var name = $('#name').val();
        email = $('#email').val();
        phone = $('#phone').val();

    $.ajax({
        url: 'mail.php',
        type: 'POST',
        data: 'name=' + name + '&email=' + email + '&phone=' + phone,

        success: function(result) {
            if (result) {
                if (result.success) {
                    $(".contact").append("<img src='OK.jpg'>");
                    $('p.error,p.correct').remove();
                    $('.contact').append(result);
                    $('#loading').fadeOut(500, function() {
                        $(this).remove();
                    });
                } else { // The server returned data, but there was an error on the server side.
                    $(".contact").append("<img src='BAD.jpg'>");
                }
            } else { // The server had a problem and didn't return any data.
                $(".contact").append("<img src='BAD.jpg'>");
            }
        }
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            // There was an error in the AJAX call.
            $(".contact").append("<img src='BAD.jpg'>");
        },
    }
});

    return false; 
});

另外,您使用的data参数错误。忽略上面示例的数据部分并将其用作您的数据:

data: {
    name: name,
    email: email,
    phone: phone
}

对于不懂 JavaScript 对象的人来说,这看起来很奇怪。如果您希望我解释为什么我们定义具有相同名称的变量,请告诉我,例如:name: name.

于 2012-06-04T21:09:06.917 回答
1

您可能希望服务器端处理程序通过响应返回其状态,例如格式化为 JSON(PHP 有一个函数)。

为了实现这一点并且仍然为非 JavaScript 用户获得良好的响应,我建议在 AJAX 中使用与表单action属性中不同的 URL,例如使用额外的查询参数 à la ?json=1。然后,如果参数存在,您的脚本通常可以执行其标准输出并返回易于解析的 JSON(例如,包含当前响应文本和状态代码的关联数组)。如果您告诉它,jQuery 的 AJAX 接口可以自动将响应解析为 JSON。

于 2012-06-04T21:04:52.383 回答