60 votes

jQuery : Effacer les entrées du formulaire

J'ai essayé plusieurs façons d'effacer un formulaire :

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

Cela fonctionne parfaitement.

jQuery #2 :

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

Cela efface le formulaire mais ne me permet plus de lui soumettre des informations. J'essaie de cliquer à nouveau sur le bouton et cela ne fait rien.

Voici le gestionnaire de clic de bouton :

$("#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 Code postal :

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

}

Si j'utilise la méthode #2 de jQuery, j'obtiens cette erreur dans la console :

Uncaught TypeError: Cannot read property 'status' of null

Pourquoi cela se produit-il ?

J'ai oublié d'inclure cette information clé :

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

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

Cela renvoie le message à la fonction AJAX dans jQuery. Il semble qu'après avoir soumis le formulaire une fois à l'aide de la méthode n° 2, les messages de réussite ou d'échec sont effacés.

151voto

Xavier Points 2806

Démo : http://jsfiddle.net/xavi3r/D3prt/

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

Réponse originale : Réinitialisation d'un formulaire à plusieurs étapes avec jQuery


La suggestion de Mike (dans les commentaires) de conserver les cases à cocher et les sélections intactes !

Attention : Si vous créez des éléments (pour qu'ils ne soient pas dans le dom), remplacez :hidden avec [type=hidden] ou tous les champs seront ignorés !

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

19voto

jwaern Points 214

Je vous recommande d'utiliser le bon vieux javascript :

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

4voto

Jacko Points 31

Il m'a fallu quelques recherches et lectures pour trouver une méthode qui convenait à ma situation : lors de l'envoi du formulaire, exécuter un ajax vers un script php distant, informer l'utilisateur en cas de succès/échec et effacer le formulaire en cas de réussite.

J'avais quelques valeurs par défaut, toutes les autres méthodes impliquaient .val(''), ce qui ne remettait pas le formulaire à zéro mais l'effaçait.

J'ai réussi à le faire fonctionner en ajoutant un bouton de réinitialisation au formulaire, qui avait un id de myform :

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

Cela m'a permis d'obtenir le résultat correct lors de la réinitialisation du formulaire.

event.preventDefault();

pour empêcher le formulaire de se soumettre dans le navigateur, comme je l'ai fait :).

Salutations

Jacko

2voto

madc Points 649

Vous pouvez essayer

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

Les entrées ne sont pas des sélecteurs, vous n'avez donc pas besoin de l'option : Je ne l'ai pas testé avec votre code. Juste une supposition rapide !

1voto

Rafael Roman Points 504

La méthode la plus simple serait :

$("#addRunner")[0].reset();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X