表格提交

时间:2010-09-06 12:46:00

标签: php jquery ajax forms post

我基本上只是尝试通过AJAX提交表单,并希望显示处理PHP页面的返回。 PHP页面只验证输入并显示发生的错误或向用户发送感谢信息。通常我不会使用ajax,但在这种情况下,客户设置需要我。

听起来很简单,我无法让它发挥作用。

我正在使用的jquery(1.4.2)代码:

$(document).ready(function() {
    $('#subscription').submit( function() {
        var inputdata = $('#subscription').serialize();
        alert(inputdata);
        $.post("process_form.php", inputdata, function(data) {alert(data);} );
    });
});

Firebug只显示:

  

POST process_form - status:aborted

另一个奇怪的观察是实际调用了成功处理程序,但是没有显示responseText。我的apache日志为进程表单显示了一条304 http消息,之后它显示了表单的状态码为200的另一行,好像它被重定向回那里,这是否是我不知道的正常AJAX行为。

W3C声明here

  

如果Location头传送的URL的来源与XMLHttpRequest源相同,并且重定向不违反无限循环预防措施,则在观察同源请求事件规则时透明地遵循重定向。否则,这是网络错误。

但我不认为我的要求违反了这些要求。

无论如何,长话短说:我被卡住了。

非常感谢任何帮助,当然我很乐意提供任何进一步的信息。

非常感谢你的时间。
一切顺利,
-G

4 个答案:

答案 0 :(得分:3)

尝试在提交处理程序的末尾返回false。我不确定发生的事情的确切顺序,但如果你不返回false,你将不会阻止表单的默认操作。因此,表单将以正常方式提交,XHR将崩溃,导致大爆炸。

答案 1 :(得分:1)

瞥一眼,尝试从$ .post()函数中删除大括号。

[编辑]

$.post("process_form.php", inputdata, function(data) {alert(data);});

答案 2 :(得分:1)

根据jQuery-docsjQuery.post应该像这样调用:

$.post("process_form.php", inputdata, function(data) {
    alert(data);
});

如果表单具有action - 属性,您可能希望禁用与表单提交相关的默认重定向。为此,您可以使用以下代码:

$('#subscription').submit(function(event) {
    event.preventDefault();
    // additional code
});

答案 3 :(得分:1)

达姆,打败了答案!

你在Firebug中获得“process_form.php”中止消息的原因是在“process_form.php”可以回复原始查询之前刷新了自己的页面,因此它被中止了!如果FORM语句中没有操作,则页面假定刷新。

对于我的便士价值,我尽量避免使用jQuery来处理事件句柄,例如POST和GET,因为通常页面会尝试刷新(因为在表单语句中没有声明任何操作)。

我在客户端使用以下代码,PHP返回格式化的XML文档。

<body>
 <form id="subscription">
  <input id="1" value="1">
  <input id="2" value="2">
  <input id="3" value="3">
  <input id="4" value="4">
  <input type="button" value="SUBMIT" onclick="submitForm()">
 </form>
 <script type="text/javascript"> 

  $(document).ready(function() {

  });

  function submitForm() {
   $.post("./process_form.php", $('#subscription').serialize(),
    function(xml) {
     alert($("SUCCESS",xml).text());
   }, "xml");
  };
 </script>
</body>

服务器端PHP:

<?php
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
 header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" );
 header("Cache-Control: no-cache, must-revalidate" );
 header("Pragma: no-cache" );
 header("Content-Type: text/xml; charset=utf-8");

 $XML = '<?xml version="1.0"?>';
 $XML .= "<ROOT>";
 $XML .= "<SUCCESS>1</SUCCESS>";
 $XML .= "</ROOT>";

 echo $XML;
?>

这样可以轻松地在服务器端进行验证,并且可以轻松返回经过验证的答案。 (例如:验证数据库,返回SUCCESS = 0以及REASON = Not in database的原因。)