【问题标题】:Jquery error: Uncaught TypeError: Cannot read property 'length' of undefinedJquery 错误:未捕获的 TypeError:无法读取未定义的属性“长度”
【发布时间】:2014-12-10 08:59:08
【问题描述】:

我有一个表单来调用 ajax 进行后端处理,所有输入都将存储在表中并返回“成功”以通知用户提交成功。但是我在回调过程中遇到了一个问题,输入数据可以保存到表中,但回调因以下错误而停止,我不知道出了什么问题,相同的脚本应用于另一个表单(具有不同的表单字段)工作正常。

控制台日志 - Chrome:

Uncaught TypeError: Cannot read property 'length' of undefined
m.extend.each
$.ajax.success
j
k.fireWith
x
b

火狐

TypeError: a is undefined

...rCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e...

firefox 错误指向f=a

脚本:

$(document).ready(function() {

        $("#status").hide();

        $('#btn_submit').click(function(){
            var params = $('#project_form').serialize();
            var btn = $(this);
            btn.button('loading')

            $.ajax({
                url: baseurl + '/process_form.php',
                type: 'POST',
                data: params,
                dataType: 'json',
                success: function(response){
                    if(response.success == 'success'){

                        $('#status').html('<b>Thank you</b>').show();

                        $('html,body').animate({
                            scrollTop: $('#top').offset().top
                        },500);

                    }else{
                        $('[id$="_error"]').html('');
                        $.each(response.error, function(key, value){
                            if(value){
                                $('#' + key + '_error').html(value);
                            }
                        });
                    }
                },
                error: function(){
                    console.log(arguments);
                }
            }).always(function(){
                btn.button('reset')
            });

        });

});

process_form.php

header("Content-Type: application/json");

$serialized_data = serialize($_POST);

$fullname = $mysqli->real_escape_string(ucwords(strtolower($_POST['fullname'])));
$age = $mysqli->real_escape_string(ucwords(strtolower($_POST['age'])));
$email = $mysqli->real_escape_string(strtolower(trim($_POST['semail'])));
$phone = $mysqli->real_escape_string(trim($_POST['phone']));
$proj_id = preg_replace('/[^0-9]/', '', $mysqli->real_escape_string($_POST['project_id']));
$proj_name = $mysqli->real_escape_string(ucwords(strtolower($_POST['project_name'])));
$agent_id = preg_replace('/[^0-9]/', '', $mysqli->real_escape_string($_POST['agent_id']));
$agent_email = $mysqli->real_escape_string(strtolower(trim($_POST['agent_email'])));
$agent_name = $mysqli->real_escape_string(ucwords(strtolower($_POST['agent_name'])));
$captcha = $_POST['captcha_code'];

$func = new Functions();
$message = array();

// validate
if(empty($fullname) || strlen($fullname) < 2){
    $message['error']['fullname'] = 'Your name is required';
}
if(empty($age)){
    $message['error']['age'] = 'Your age is required';
}
if(!$func->check_email_address($email)){
    $message['error']['semail']  = 'Invalid email address';
}
if(empty($phone) || strlen($phone) < 10){
    $message['error']['phone'] = 'Phone num is required';
}

$securimage = new Securimage();
$securecode = $securimage->getCode();
if(strtolower($securecode) != strtolower($captcha)) {
    $message['error']['captcha'] = 'Incorrect security code';
}


if(!isset($message['error'])){

    // insert table
    $create = $mysqli->query("INSERT INTO `xxx` ...") or die($mysqli->error);

    if($create){
        //send email
        $to = xxx;
        $subject = 'yyy';
        $msg = '<html>
                    <body>
                        blah...
                    </body>
                </html>';
        $from = zzz;
        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
        $headers .= 'From: '.$fullname.' <'.$from.'>' . "\r\n";

        if(mail($to, $subject, $msg, $headers)){
            $message['success'] = 'success';
        }
    }

}

echo json_encode($message);

【问题讨论】:

    标签: php jquery ajax


    【解决方案1】:

    改变这个:

     if(response.success == 'success'){
    

    到这里:

     if(response[0].success == 'success'){
    

    在我看来,您有一个对象数组[{}],所以response.success 不可用,相反,您可以像response[0].success 上面的答案中建议的那样传递索引。

    【讨论】:

    • url: baseurl + '/process_form.php', 您可以从浏览器的网络选项卡中发布响应吗?只需单击网络选项卡中的链接并检查响应选项卡。
    【解决方案2】:

    我认为是因为mail函数失败,在这里返回false

    if(mail($to, $subject, $msg, $headers)){
       $message['success'] = 'success';
    }
    

    所以您的回复既没有success 属性,也没有error 属性,这会导致此处出现错误:

    $.each(response.error, function(key, value){
       if(value){
          $('#' + key + '_error').html(value);
       }
    });
    

    你可以试试这样的:

    if(mail($to, $subject, $msg, $headers)){
        $message['success'] = 'success';
    }else{
        $message['error']['mail'] = 'Mail error!';
    }
    

    或者不管邮件是否成功,数据存入表后直接设置$message['success'] = 'success';

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2016-11-17
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多