2010-09-06 203 views
2

我基本上只是試圖通過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);}); 
    }); 
}); 

螢火蟲只顯示:

POST process_form - 狀態:已中止

另一個有趣的結果是成功處理程序實際上被調用,但沒有顯示responseText。我的apache日誌顯示了處理表單的304 http消息,在此之後,它顯示另一行狀態碼爲200的表單,就好像它被重定向到那裏一樣,無論這是否是正常的AJAX行爲,我不知道。

W3C狀態here

如果Location頭傳達的URL的起源與XMLHttpRequest的起源和重定向不違反無限循環的注意事項同根同源,透明地執行重定向,同時觀察相同 - 原始請求事件規則。否則,這是一個網絡錯誤。

但我不認爲我的請求違反了這些規定。

無論如何,長話短說:我卡住了。

任何幫助將非常感激,當然我很樂意提供任何進一步需要的信息。

非常感謝您的時間。
一切順利,
-G

回答

3

試着在你提交處理程序結束返回false。我不確定發生的事情的確切順序,但是如果您不返回false,則不會阻止表單的默認操作。所以,表單會按照正常的方式提交,而XHR會崩潰導致大爆炸。

+0

非常感謝您的回覆,將此添加到submit()塊確實改變了一些內容。該請求現在成功,並且Firebug顯示「找到302狀態」,但仍然沒有給出responseText。我會測試一些事情,看看我現在能否實現它。乾杯! – 2010-09-06 13:20:09

+1

更新:它現在有效,我的PHP中的某些內容解僱了302,但我知道可能發生。非常感謝你的幫助:) – 2010-09-06 13:25:48

+0

這是一個救生員 - 非常感謝你! – rshimoda 2011-09-22 21:43:23

1

一目瞭然,嘗試從$。員額()功能刪除大括號。

[編輯]

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

感謝您的回覆,我通常沒有使用的帖子左右花括號,我不小心將它們留下同時從$ .ajax變回。 – 2010-09-06 13:16:12

1

按照jQuery-docsjQuery.post應該叫這樣的:

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

如果表單有action -attribute,你可能要禁用有關表單提交的默認重定向。要達到此目的,您可以使用以下代碼:

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

感謝您的回覆,我通常不會使用的帖子周圍的大括號,我不小心將它們留在了$ .ajax中。添加event.preventDefault();停止了整個ajax調用的工作。 – 2010-09-06 13:15:33

+0

我不確定這是如何避免ajax請求。你忘記添加事件變量作爲函數參數嗎? Firebug報告過任何JavaScript錯誤嗎?這可以解釋爲什麼請求不會觸發。 – jwueller 2010-09-06 13:21:58

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 =不在數據庫中。)