jQuery: Clearing Form Inputs

JqueryFormsConsole

Jquery Problem Overview


I have tried to different ways to clear a form:

<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('');
}

This works perfectly.

jQuery #2:

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

This clears the form but does not let me submit any more any information to it. I try and click the button again and it does nothing.

Here's the button click handler:

$("#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 Post code:

<?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;
}

}

If I use jQuery method #2, I get this error in the console:

Uncaught TypeError: Cannot read property 'status' of null

Why does this happen?

I forgot to include this key information:

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

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

This sends the message back to the AJAX function in jQuery. It looks like after I submit the form once using method #2 the success/fail messages are blanked out.

Jquery Solutions


Solution 1 - Jquery

Demo : http://jsfiddle.net/xavi3r/D3prt/

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

Original Answer: https://stackoverflow.com/questions/680241/blank-out-a-form-with-jquery


Mike's suggestion (from the comments) to keep checkbox and selects intact!

Warning: If you're creating elements (so they're not in the dom), replace :hidden with [type=hidden] or all fields will be ignored!

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

Solution 2 - Jquery

I'd recomment using good old javascript:

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

Solution 3 - Jquery

Took some searching and reading to find a method that suited my situation, on form submit, run ajax to a remote php script, on success/failure inform user, on complete clear the form.

I had some default values, all other methods involved .val('') thereby not resetting but clearing the form.

I got this too work by adding a reset button to the form, which had an id of myform:

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

This for me had the correct outcome on resetting the form, oh and dont forget the

event.preventDefault();

to stop the form submitting in browser, like I did :).

Regards

Jacko

Solution 4 - Jquery

You may try

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

Inputs are no selectors, so you do not need the : Haven't tested it with your code. Just a fast guess!

Solution 5 - Jquery

I figured out what it was! When I cleared the fields using the each() method, it also cleared the hidden field which the php needed to run:

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

I used the :not() on the selection to stop it from clearing the hidden field.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCharles BlackwellView Question on Stackoverflow
Solution 1 - JqueryXavierView Answer on Stackoverflow
Solution 2 - JqueryjwaernView Answer on Stackoverflow
Solution 3 - JqueryJackoView Answer on Stackoverflow
Solution 4 - JquerymadcView Answer on Stackoverflow
Solution 5 - JqueryCharles BlackwellView Answer on Stackoverflow