2011-04-14 158 views
2

我正在使用jQuery $ .ajax将简单的联系表单发布到php脚本。我试图评估响应并基于此,或者用“谢谢”消息来替换整个表单,或者用问题填充“错误”div。成功回调被称为,所以(我认为)没有错误,但数据仍然是空的。

jQuery代码:

$(document).ready(function() { 
    $("input[type='submit']").click(function(event) { 
     event.preventDefault(); 
     var name = '#' + $(this).closest('form').attr('name'); 
     $.ajax({ 
     url: "ajax/index1.php", 
     type: "POST", 
     data: $(name).serialize(), 
     success: function(data) { 
      alert(data); 
      if (data == 'yes') { 
       $('#error').html(data); 
      } else { 
       $(name).html(data); 
      } 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      alert(textStatus); 
     } 
     }); 
    }); 
}); 

我敢肯定的成功的功能(不是错误之一)运行,因为我得到了警告,即使我删除了错误的功能。另外,如果我删除该警报线,我不会收到任何警报。而表单内容正在被一个空白的div所替代,所以它看起来很顺利。

另外,如果我取代“警报(数据)”与不秀“警报(‘你好’)”。所以数据是空的!

如果我尝试直接发布形式(无jQuery的),我从PHP页面的响应 - 无论是“请输入您的姓名请输入您的电子邮件请输入您的公司。”或者“谢谢你!你的信息已经提交。”

一切都是在同一个域。

为什么数据为空?在过去的6个小时里,我无法理解这一点。

我没有设置任何全局AJAX设置。在发布之前,我也尝试过使用JSON,就像其中一个答案和相同结果中所建议的一样 - 空响应。我也尝试过xml。

index1.php有一吨的涉及到其他形式的网站上的代码。它的要点:

if (!isset($_POST['submit'])) exit(); 
if (isset($_POST['submit'])) { 
    switch (basename($_SERVER['HTTP_REFERER'])) { 
//define required fields, fields to e-mail in the form, success message, form div id... 
    } 
} 
if (is_array($required)) { 
    $errors = array(); 
    foreach ($required as $req) { 
     $error = ''; 
     if (empty($_POST[$req])) { 
      switch ($req) { 
//adjust error message based on name of field... 
        default: $error = 'Please enter your ' . $req . '.'; 
      } 
      $errors[] = $error; 
     } 
    } 
} 
    if (empty($errors) && is_array($fields)) { 
     //decide to which e-mail address to send everything based on the form input 
     $headers = "From: ..."; 
     $subject = "Inquiry"; 
    $body = "The following information was submitted:\n\n"; 
    foreach ($fields as $a => $b) { 
     if (is_array($_POST[$a])) { 
      $body .= sprintf("%s: %s\n", $b, stripslashes(implode(', ', $_POST[$a]))); 
     } else { 
      $body .= sprintf("%s: %s\n", $b, stripslashes($_POST[$a])); 
     } 
    } 
    $send = mail($to, $subject, $body, $headers); 
    if (!$send) $msg = 'We encountered an error sending your message, please go back and try again. If the problem persists, please call us.'; 
} 
$error = 'no'; 
if (is_array($msg)) { 
    $msg = implode(' ', $msg); 
    $error = 'yes'; 
} 
header('Content-type: text/html'); 
echo $error . ' ' . $msg; 
} 

我显然会改变最终文本中呼应的东西,其实是可以有意义解析,但在这一点上,我只是想获得一些在成功展示回电话。

一个想法 - 可能$ _ SERVER [ 'HTTP_REFERER']我的问题?我正在从原型切换,这不是一个问题,所以我认为这是理所当然的。如果是的话,是否有一种方法来识别提交表单的页面?

[UPDATE]尝试在$ _SERVER ['HTTP_REFERER']开关语句下添加一个“默认”方案无济于事,所以我猜这不是问题。

+0

whay是在index1.php我可以看到吗? – 2011-04-14 01:51:37

+0

我假设你的提交按钮被称为'submit'?这会在你的AJAX调用中填充吗?如果index1.php正在第一行退出,这将解释空响应。如果你从'if(!isset($ _ POST ['submit']))' – 2011-04-14 03:00:45

+0

我改变了数据:$(name).serialize()到data:$(name).serialize() +'&submit = Submit',现在它工作得很好。谢谢! – Rubin 2011-04-14 03:22:14

回答

2

AJAX的问题是,要覆盖默认提交按钮的动作,所以提交按钮的功能不是真的提交的数据,Javascript那是干嘛的呢看看Javascript代码,$_POST['submit']永远不会设置的时候PHP页被称为:

var name = '#' + $(this).closest('form').attr('name'); 
    ... 
    data: $(name).serialize(), 

唯一POST信息发送这里是可变name,尝试发送submit场一定的价值,你会看到一个不同的反应。

您还可以检查这是否真的发生改变exit()die('empty submit')

+0

谢谢!这解决了我的问题。我仍然不明白为什么这不是原型的问题(我使用的是相同的jQuery代码,但将它发送给原型函数而不是ajax部分),但至少现在已经算出来了。 – Rubin 2011-04-14 03:04:07

0

尝试添加dataType: "text"选项和完整的回调下方检查您回应

complete: function(xhr, status) { 

     alert(xhr.responseText);  
} 
+0

完整的回调函数也返回空。我删除了所有其他“警报”,以确保这是正在运行的那个。 – Rubin 2011-04-14 02:57:41

+0

还试图提醒完整回调中的状态,并显示“成功”... – Rubin 2011-04-14 03:00:24