2011-10-17 103 views
59

我曾嘗試不同的方法來清除表單:jQuery的:清除表單輸入

<form action="service.php" id="addRunner" name="addRunner" method="post"> 
First Name: <input type="text" name="txtFirstName" id="txtFirstName" /><br /> 
Last Name: <input type="text" name="txtLastName" id="txtLastName" /><br /> 
Gender: <select id="ddlGender" name="ddlGender"><option value="">--Please Select--</option> 
<option value="f">Female</option> 
<option value="m">Male</option> 
</select><br /> 
Finish Time: 
<input type="text" name="txtMinutes" id="txtMinutes" size="10" maxlength="2">(Minutes) 
<input type="text" name="txtSeconds" id="txtSeconds" size="10" maxlength="2">(Seconds) 
<br /> 
<button type="submit" name="btnSave" id="btnSave">Add Runner</button> 
<input type="hidden" name="action" value="addRunner" id="action"> 
</form> 

jQuery的#1:

function clearInputs(){ 
$("#txtFirstName").val(''); 
$("#txtLastName").val(''); 
$("#ddlGender").val(''); 
$("#txtMinutes").val(''); 
$("#txtSeconds").val(''); 
} 

這完美的作品。

jQuery的#2:

function clearInputs(data){ 
$("#addRunner :input").each(function(){ 
$(this).val(''); 
}); 

這將清除的形式,但並不讓我更多的任何信息提交給它。我嘗試再次點擊按鈕,它什麼都不做。

這裏的按鈕單擊處理程序:

$("#btnSave").click(function(){ 
    var data = $("#addRunner :input").serializeArray(); 
    $.post($("#addRunner").attr('action'), data, function(json){ 
     if (json.status == "fail"){ 
      alert(json.message); 
     } 
     if (json.status == "success"){ 
      alert(json.message); 
      clearInputs(); 
     } 
    }, "json"); 
}); 

PHP郵編:

<?php 
if($_POST){ 
    if ($_POST['action'] == 'addRunner') { 
     $fname = htmlspecialchars($_POST['txtFirstName']); 
     $lname = htmlspecialchars($_POST['txtLastName']); 
     $gender = htmlspecialchars($_POST['ddlGender']); 
     $minutes = htmlspecialchars($_POST['txtMinutes']); 
     $seconds = htmlspecialchars($_POST['txtSeconds']); 
     if(preg_match('/[^\w\s]/i', $fname) || preg_match('/[^\w\s]/i', $lname)) { 
      fail('Invalid name provided.'); 
     } 
     if(empty($fname) || empty($lname)) { 
       fail('Please enter a first and last name.'); 
     } 
     if(empty($gender)) { 
      fail('Please select a gender.'); 
     } 
     if(empty($minutes) || empty($seconds)) { 
      fail('Please enter minutes and seconds.'); 
     } 
     $time = $minutes.":".$seconds; 

    $query = "INSERT INTO runners SET first_name='$fname', last_name='$lname', gender='$gender', finish_time='$time'"; 
    $result = db_connection($query); 

    if ($result) { 
     $msg = "Runner: ".$fname." ".$lname." added successfully" ; 
     success($msg); 
    } else { 
     fail('Insert failed.'); 
    } 
    exit; 
} 

}

如果我使用jQuery方法#2,我在控制檯收到此錯誤:

Uncaught TypeError: Cannot read property 'status' of null 

爲什麼會發生這種情況?

我忘了,包括這個關鍵信息:

function fail ($message){ 
    die(json_encode(array('status'=>'fail', 'message'=>$message))); 
} 

function success ($message){ 
    die(json_encode(array('status'=>'success', 'message'=>$message))); 

這將消息發送回jQuery中的AJAX功能。看起來好像在我使用方法#2提交表單之後,成功/失敗消息將被清空。

+1

有些HTML會有幫助,而你的PHP在這種情況下是不必要的。 – vzwick

+0

請顯示您的表單的HTML。 – spicavigo

+0

此外,您的代碼可能容易受到[SQL注入](http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain)。我最好不要提交'羅伯特'; DROP TABLE跑步者; --'我的名字... – vzwick

回答

146

演示:http://jsfiddle.net/xavi3r/D3prt/

$(':input','#myform') 
    .not(':button, :submit, :reset, :hidden') 
    .val('') 
    .removeAttr('checked') 
    .removeAttr('selected'); 

原來的答案:Resetting a multi-stage form with jQuery


麥克的建議(從評論),以保持複選框,並選擇完整!

警告:如果您要創建的元素(所以他們不是在DOM),更換:hidden[type=hidden]或所有字段將被忽略!

$(':input','#myform') 
    .removeAttr('checked') 
    .removeAttr('selected') 
    .not(':button, :submit, :reset, :hidden, :radio, :checkbox') 
    .val(''); 
+20

我建議在選擇輸入後立即刪除「checked」和「selected」屬性,然後過濾掉:button,:submit,:reset,:hidden,:radio和:複選框將其餘輸入值設置爲「 」。否則,您會發現自己的複選框和收音機在清除後沒有任何值。所以它是這樣的: $(':input','#myform') .removeAttr('checked') .removeAttr('selected') .not(':button,:submit,:reset, :hidden,:radio,:checkbox') .val(''); –

+1

你應該在原生JavaScript中使用「reset()」方法。 @查看jwaern的答案。如果你對JavaScript不太好,你仍然可以使用$('whatever-the-selector-is')。get(0).reset()。清理,不會刪除單選按鈕和複選框中的值,只需要一行javascript,可能比此解決方案更快。 – Bene

+0

這是最好的解決方案,謝謝! –

2

您可以嘗試

$("#addRunner input").each(function(){ ... }); 

輸入是沒有選擇,所以你不需要: 有沒有你的代碼進行了測試。只是一個快速的猜測!

18

我會使用電子書籍好老的javascript:

document.getElementById("addRunner").reset(); 
+0

@詹姆斯你不需要''#'對的getElementById()',它僅用於*選擇字符串*的東西像jQuery的'$(...)'或本機JS相當於'querySelectorAll(... )'。 – MTCoster

4

採取了一些搜索和閱讀找到適合我的情況的方法,在表單提交,運行AJAX到遠程PHP腳本,上成功/失敗通知用戶,完整清除表格。

我有一些默認值,參與.VAL(「」),從而不進行重置,但清除表單中的所有其他方法。

我這也加入了復位按鈕的形式,它具有myform一個id工作:

$("#myform > input[type=reset]").trigger('click'); 

這對我對重置形成正確的結果,噢,不要忘了

event.preventDefault(); 

停止窗體在瀏覽器中提交,就像我做的:)。

問候

傑克遜

0

我想通了,這是什麼!當我清除使用每個()方法的領域中,也被清除的隱藏字段,它的PHP的需要運行:

if ($_POST['action'] == 'addRunner') 

我使用了:不()上的選擇,從清除隱藏字段阻止它。