我基本上只是尝试通过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
答案 0 :(得分:3)
尝试在提交处理程序的末尾返回false
。我不确定发生的事情的确切顺序,但如果你不返回false,你将不会阻止表单的默认操作。因此,表单将以正常方式提交,XHR将崩溃,导致大爆炸。
答案 1 :(得分:1)
瞥一眼,尝试从$ .post()函数中删除大括号。
[编辑]
$.post("process_form.php", inputdata, function(data) {alert(data);});
答案 2 :(得分:1)
根据jQuery-docs,jQuery.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的原因。)