Jquery错误:未捕获的TypeError:无法读取未定义的属性“长度”

我有一个表单来调用ajax进行后端处理,所有输入都将存储在表中并返回’success’以通知用户提交成功。 但是我在回调期间面临一个问题,输入数据可以保存到表中,但回调停止时出现错误,我不知道出了什么问题,同一个脚本被应用到另一个表单(具有不同的表单字段)工作正常。

控制台日志 – 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('Thank you').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) check_email_address($email)){ $message['error']['semail'] = 'Invalid email address'; } if(empty($phone) || strlen($phone) 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 = '  blah...  '; $from = zzz; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n"; $headers .= 'From: '.$fullname.' ' . "\r\n"; if(mail($to, $subject, $msg, $headers)){ $message['success'] = 'success'; } } } echo json_encode($message); 

改变这个:

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

对此:

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

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

我认为这是因为mailfunction失败了,在这里返回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'; 无论邮件成功与否,直接将数据保存到表中