【问题标题】:JQuery not displaying HTML data from ajax responseJQuery 不显示来自 ajax 响应的 HTML 数据
【发布时间】:2015-04-15 03:19:56
【问题描述】:

你好,

我有一个表单,它只接受用户的用户名和电子邮件。输入通过客户端和服务器端进行清理。

脚本发送 POST 没有问题,它返回的数据应该是我在日志中检查过的。但是,由于某种原因,数据没有显示在浏览器中。

代码在下面,我觉得这是一个我忽略的愚蠢项目,但我在任何地方都找不到它

<!DOCTYPE HTML>
<HEAD>
<TITLE>Jeremy's Form Submit Test </TITLE>

<script type="text/javascript" src="js/jquery-1.11.2.js"></script>
<script>
$(document).ready(function()
{
        $("#FormSubmit").click(function() //Set click action on formsubmit button
        {
                var submit = true;
                $('#MainForm input[type="text"]').each(function() //Loop through input fields to ensure data is present
                {
                    if($.trim($('#User').val()) == '') //Remove whitespaces and check if field is empty
                    {
                        alert('Input can not be blank');
                        submit = false;
                    }

                    var regex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/; //RegEx to test email against
                    if(!regex.test($.trim($('#Email').val()))) //If supplied email without whitespaces doesn't match pattern, then alert user
                    {
                        alert('Please provide a valid email');
                        submit = false;
                    }
                });
                if(submit == true) //If data is present, then prepare email and user values to be submitted to .php page
                {
                    data = {'user_name': $('#User').val(), 'email': $('#Email').val()}; //Add username and email to array
                    $.post("success.php", data, function(ReturnedData) //post data via ajx to success.php and retrieve response
                    {
                        console.log(JSON.stringify(ReturnedData));
                        if(ReturnedData.Type == 'Error') //If error returned, display error message
                        {
                            var results = '<h1>'+ReturnedData.Message+'</h1>';
                        }
                        else if(ReturnedData.Type == 'Success') //If success returned, display message and remove submit button
                        {
                            var results = '<h1>'+ReturnedData.Message+'</h1>';
                            $('#FormSubmit').remove();
                        }
                        $('div#DataHolder').html(results);
                    }, 'json');
                }
        });

});
</script>

</HEAD>

<BODY>

<form id="MainForm">
*UserName: <input type="text" id="User" name="FormUsername" required /> 
*Email: <input type="email" id="Email" name="FormEmail" required />
<input type="submit" id="FormSubmit" value="Submit">
</form>

<div id="DataHolder"></div>


</BODY>
</HTML>

下面的 PHP 文件返回一个 json_encoded 响应,我已经通过控制台日志确认数据正在正确返回,但它没有显示在我设置的 div 中。日志文件显示正确的响应,但未显示:

{"Type":"Error","Message":"用户名必须至少为 3 个字符!!!"}

<?php

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') //Check apache header to ensure its a json request
{
    $ReturnedData = json_encode(array("Type" => "Error", "Message" => "Naughty naughty. This wasn't an ajax request"));
    die($ReturnedData);
}

if(isset($_POST)) //Ensure that POST is set
{
    //Santiaze the post variables to be double sure no one is up to any funky business
    $SaniUser = filter_var($_POST['user_name'],FILTER_SANITIZE_STRING);
    $SaniEmail = filter_var($_POST['email'],FILTER_SANITIZE_EMAIL);

    //Check that username is at least 3 characters and return error if it's not
    if(strlen($SaniUser) != 3)
    {
        $ReturnedData = json_encode(array("Type" => "Error", "Message" => "UserName must be at least 3 characters!!!"));
        die($ReturnedData);
    }
    //Check that email is a valid email
    if(!filter_var($SaniEmail,FILTER_VALIDATE_EMAIL))
    {
        $ReturnedData = json_encode(array("Type" => "Error", "Message" => "Please supply a valid email address!!!"));
        die($ReturnedData);
    }
    //All variables are good. Return successfully message
    $ReturnedData = json_encode(array("Type" => "Success", "Message" => "SUCCESS!!!" .$SaniUser. "Has successfully submitted the form"));
    die($ReturnedData);
}
else
{
    $ReturnedData = json_encode(array("Type" => "Error", "Message" => "Naughty naughty. No data was submitted!!!"));
    die($ReturnedData);
}

?>

【问题讨论】:

  • 我的猜测是 ReturnedData 在这一点上不是一个对象。我认为您必须指定 jQuery 以使用 dataType: "json" 期待 json。而不是console.log(JSON.stringify(ReturnedData)); 尝试console.log(ReturnedData.Type); 看看是否是undefined
  • 为什么是$('div#DataHolder') 而不仅仅是$('#DataHolder')
  • ReturnedData 是一个对象。这就是您看到消息的原因:{"Type":"Error","Message":"UserName must be at least 3 characters!!!"}。如果它不是对象,则日志文件不会显示该数据。我现在将检查 DataHolder

标签: javascript php jquery html ajax


【解决方案1】:

WOWOWOW 这个问题正盯着我。

当数据存在时,我最初没有初始化 var 结果。所以当我调用 .html(results) 时,结果变量的作用域只在 if/else 语句中。

在 if 语句的顶部设置变量,然后将返回的数据设置为该值是可行的

更新代码如下:

if(submit == true) //If data is present, then prepare email and user values to be submitted to .php page
                {
                    var results;
                    data = {'user_name': $('#User').val(), 'email': $('#Email').val()}; //Add username and email to array
                    $.post("success.php", data, function(ReturnedData) //post data via ajx to success.php and retrieve response
                    {
                        console.log(JSON.stringify(ReturnedData));
                        if(ReturnedData.Type == 'Error') //If error returned, display error message
                        {
                            results = '<h1>'+ReturnedData.Message+'</h1>';
                            //alert(ReturnedData.Message);
                        }
                        else if(ReturnedData.Type == 'Success') //If success returned, display message and remove submit button
                        {
                            $('#FormSubmit').hide();
                            results = '<h1>'+ReturnedData.Message+'</h1>';


                        }
                        $('#DataHolder').html(results);

                    }, 'json');
                }

【讨论】:

  • “我最初没有在数据存在时初始化 var 结果。所以当我调用 .html(results) 时,结果变量范围仅在 if/else 语句中。” 嗯...这不是 javascript 的工作方式。 if/else 语句没有自己的范围。我怀疑有其他东西改变了它。
  • $('div#DataHolder') -> $('#DataHolder') 可能吗?取决于 html。
  • 要清楚,在 if 语句之外声明 var 是一种很好的做法,它只是不能解决您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 2018-05-31
  • 2018-03-12
  • 2016-12-28
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多