Réinitialiser une forme multi-étapes avec jQuery

j'ai un formulaire avec un bouton de réinitialisation standard codé thusly:

<input type="reset" class="button standard" value="Clear" />

le problème est que ce formulaire est du type multi-étapes, donc si un utilisateur remplit une étape et retourne plus tard, les valeurs "mémorisées" pour les différents champs ne seront pas réinitialisées lorsque le bouton clair est cliqué.

je pense qu'attacher une fonction jQuery pour boucler tous les champs et les effacer 'manuellement' ferait l'affaire. J'utilise déjà jQuery dans le formulaire, mais je suis seulement en train de me mettre à jour et donc je ne suis pas sûr de savoir comment faire, à part me référer individuellement à chaque champ par ID, ce qui ne semble pas très efficace.

TIA pour toute aide.

340
demandé sur default locale 2009-03-25 07:40:59

29 réponses

mis à jour en Mars 2012.

donc, deux ans après que j'ai répondu à cette question à l'origine, je reviens pour voir que cela s'est à peu près transformé en un grand désordre. Je pense qu'il est grand temps que j'y revienne et que ma réponse soit vraiment correcte puisqu'elle est la plus accueillie+.

pour mémoire, la réponse de Titi est fausse car ce n'est pas ce que l'affiche originale demandait - il est correct qu'il soit possible de réinitialiser un formulaire en utilisant le reset natif() méthode, mais cette question Est d'essayer d'effacer une forme hors des valeurs mémorisées qui resteraient dans la forme si vous la réinitialisez de cette façon. C'est pourquoi une réinitialisation" manuelle " est nécessaire. Je suppose que la plupart des gens ont fini dans cette question à partir d'une recherche Google et sont vraiment à la recherche de la méthode reset (), mais cela ne fonctionne pas pour le cas spécifique dont L'OP parle.

Mon original réponse:

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

qui pourrait fonctionner pour un grand nombre de cas, y compris pour L'OP, mais comme indiqué dans les commentaires et dans d'autres réponses, permettra de supprimer les éléments radio/case à cocher de tous les attributs de valeur.

Un plus correct réponse (mais pas parfait) est:

function resetForm($form) {
    $form.find('input:text, input:password, input:file, select, textarea').val('');
    $form.find('input:radio, input:checkbox')
         .removeAttr('checked').removeAttr('selected');
}

// to call, use:
resetForm($('#myform')); // by id, recommended
resetForm($('form[name=myName]')); // by name

utilisant le :text , :radio , etc. les sélecteurs par eux-mêmes est considéré comme une mauvaise pratique par jQuery car ils finissent par évaluer à *:text ce qui rend beaucoup plus long qu'il ne devrait. Je préfère l'approche de la liste blanche et j'aurais aimé l'avoir utilisée dans ma réponse initiale. Quoi qu'il en soit, en spécifiant la partie input du sélecteur, plus le cache de l'élément de forme, cela devrait en faire la réponse la plus performante ici.

cette réponse pourrait encore avoir quelques défauts si la valeur par défaut des éléments select n'est pas une option qui a une valeur vide, mais elle est certainement aussi générique qu'elle va l'être et cela devrait être traité au cas par cas.

490
répondu Paolo Bergantino 2012-06-05 22:46:11

de http://groups.google.com/group/jquery-dev/msg/2e0b7435a864beea :

$('#myform')[0].reset();

réglage myinput.val('') pourrait ne pas émuler "reset" 100% si vous avez une entrée comme ceci:

<input name="percent" value="50"/>

par exemple appeler myinput.val('') sur une entrée avec une valeur par défaut de 50 serait fixé à une chaîne vide, alors que l'appel de myform.reset() serait de le réinitialiser à sa valeur initiale de 50.

389
répondu Titi Wangsa bin Damhore 2011-08-01 18:00:24

il y a un gros problème avec la réponse acceptée de Paolo. Prendre en considération:

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

la ligne .val('') permet également d'Effacer les cases à cocher et les boutons radio de la ligne value . Donc si (comme moi) vous faites quelque chose comme ceci:

<input type="checkbox" name="list[]" value="one" />
<input type="checkbox" name="list[]" value="two" checked="checked" />
<input type="checkbox" name="list[]" value="three" />

L'utilisation de la réponse acceptée transformera vos entrées en:

<input type="checkbox" name="list[]" value="" />
<input type="checkbox" name="list[]" value="" />
<input type="checkbox" name="list[]" value="" />

Oups - j'ai été en utilisant cette valeur!

une version modifiée qui gardera votre case à cocher et les valeurs radio:

// Use a whitelist of fields to minimize unintended side effects.
$('INPUT:text, INPUT:password, INPUT:file, SELECT, TEXTAREA', '#myFormId').val('');  
// De-select any checkboxes, radios and drop-down menus
$('INPUT:checkbox, INPUT:radio', '#myFormId').removeAttr('checked').removeAttr('selected');
48
répondu leepowers 2012-04-10 23:16:55

le nettoyage des formulaires est un peu délicat et pas aussi simple qu'il en a l'air.

suggérez d'utiliser le jQuery form plugin et d'utiliser ses clearForm ou resetForm fonctionnalité. Il s'occupe de la plupart des cas du coin.

14
répondu Cherian 2009-03-25 05:17:45

document.getElementById ("frm").reset ()

14
répondu sth 2010-04-28 03:00:44

Plugin jQuery

j'ai créé un plugin jQuery pour que je puisse l'utiliser facilement partout où j'en ai besoin:

jQuery.fn.clear = function()
{
    var $form = $(this);

    $form.find('input:text, input:password, input:file, textarea').val('');
    $form.find('select option:selected').removeAttr('selected');
    $form.find('input:checkbox, input:radio').removeAttr('checked');

    return this;
}; 

donc maintenant je peux l'utiliser en appelant:

$('#my-form').clear();
14
répondu Francis Lewis 2012-12-13 19:38:09

j'ai l'habitude de faire:

$('#formDiv form').get(0).reset()

ou

$('#formId').get(0).reset()
13
répondu Ricardo Bin 2010-04-28 03:00:30

envisagez d'utiliser le plugin de validation - c'est génial! Et le formulaire de Reset est simple:

var validator = $("#myform").validate();
validator.resetForm();
5
répondu dmitko 2010-07-06 07:29:36

Voici quelque chose pour vous aider à démarrer

$('form') // match your correct form 
.find('input[type!=submit], input[type!=reset]') // don't reset submit or reset
.val(''); // set their value to blank

bien sûr, si vous avez des cases à cocher / boutons radio, vous aurez besoin de modifier ceci pour les inclure aussi et mettre .attr({'checked': false});

modifier Paolo réponse est plus concis. Ma réponse est plus verbeuse parce que je ne connaissais pas le sélecteur :input , et je n'ai pas pensé à simplement enlever l'attribut vérifié.

4
répondu alex 2017-05-23 11:54:58

je trouve que cela fonctionne bien.

$(":input").not(":button, :submit, :reset, :hidden").each( function() {
    this.value = this.defaultValue;     
});
4
répondu DampeS8N 2010-06-12 22:06:57

fondamentalement aucune des solutions fournies me rend heureux. comme l'ont souligné quelques personnes, ils vident le formulaire au lieu de le réinitialiser.

cependant, il y a quelques propriétés javascript qui aident:

  • valeur par défaut pour les champs de texte
  • defaultChecked for checkbox and radio buttons
  • defaultSelected for select options""

ces champs stockent la valeur qu'un champ avait lorsque la page a été chargée.

écrire un plugin jQuery est maintenant trivial: (pour les impatients... voici une démo http://jsfiddle.net/kritzikratzi/N8fEF/1 / )

plugin-code

(function( $ ){
    $.fn.resetValue = function() {  
        return this.each(function() {
            var $this = $(this); 
            var node = this.nodeName.toLowerCase(); 
            var type = $this.attr( "type" ); 

            if( node == "input" && ( type == "text" || type == "password" ) ){
                this.value = this.defaultValue; 
            }
            else if( node == "input" && ( type == "radio" || type == "checkbox" ) ){
                this.checked = this.defaultChecked; 
            }
            else if( node == "input" && ( type == "button" || type == "submit" || type="reset" ) ){ 
                // we really don't care 
            }
            else if( node == "select" ){
                this.selectedIndex = $this.find( "option" ).filter( function(){
                    return this.defaultSelected == true; 
                } ).index();
            }
            else if( node == "textarea" ){
                this.value = this.defaultValue; 
            }
            // not good... unknown element, guess around
            else if( this.hasOwnProperty( "defaultValue" ) ){
                this.value = this.defaultValue; 
            }
            else{
                // panic! must be some html5 crazyness
            }
        });
    }
} )(jQuery);

utilisation

// reset a bunch of fields
$( "#input1, #input2, #select1" ).resetValue(); 

// reset a group of radio buttons
$( "input[name=myRadioGroup]" ).resetValue(); 

// reset all fields in a certain container
$( "#someContainer :input" ).resetValue(); 

// reset all fields
$( ":input" ).resetValue(); 

// note that resetting all fields is better with the javascript-builtin command: 
$( "#myForm" ).get(0).reset(); 

quelques notes ...

  • je n'ai pas regardé dans le nouveau html5 il y en a qui ont besoin d'un traitement spécial, mais la même idée devrait fonctionner.
  • Les éléments
  • doivent être référencés directement. c'est à dire $( "#container" ).resetValue() ne fonctionne pas. utilisez toujours $( "#container :input" ) à la place.
  • comme mentionné ci-dessus, voici une démo: http://jsfiddle.net/kritzikratzi/N8fEF/1 /
4
répondu kritzikratzi 2012-05-14 20:37:00

vous pourriez trouver que c'est en fait plus facile à résoudre sans jQuery.

en JavaScript normal, c'est aussi simple que:

document.getElementById('frmitem').reset();

j'essaie de toujours me rappeler que bien que nous utilisions jQuery pour améliorer et accélérer notre codage, parfois il n'est pas vraiment plus rapide. Dans ces cas, il est souvent préférable d'utiliser une autre méthode.

4
répondu Ken Le 2012-11-27 00:32:33

j'ai fait une légère variation de Francis Lewis " bonne solution . Ce que sa solution ne fait pas, c'est de mettre les sélections à blanc. (Je pense que lorsque la plupart des gens veulent "effacer", ils veulent probablement rendre toutes les valeurs vides.), Celui-ci le fait avec .find('select').prop("selectedIndex", -1) .

$.fn.clear = function()
{
    $(this).find('input')
            .filter(':text, :password, :file').val('')
            .end()
            .filter(':checkbox, :radio')
                .removeAttr('checked')
            .end()
        .end()
    .find('textarea').val('')
        .end()
    .find('select').prop("selectedIndex", -1)
        .find('option:selected').removeAttr('selected')
    ;
    return this;
};
4
répondu Luke 2017-05-23 12:34:47

j'ajoute normalement un bouton de réinitialisation caché au formulaire. lorsque nécessaire: $ ('#reset').cliquez sur();

2
répondu Alberto Nunes 2011-10-10 16:27:43

Modification de la plus-voté réponse pour le $(document).ready() :

$('button[type="reset"]').click(function(e) {
    $form = $(this.form);
    $form.find('input:text, input:password, input:file, select, textarea').val('');
    $form.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
    e.preventDefault();
});
2
répondu Slawa 2012-09-15 00:19:30

utilisez simplement le jQuery Trigger event comme suit:

$('form').trigger("reset");

cela réinitialisera les cases à cocher, les radiobuttons, les boîtes de textes, etc... Essentiellement, il tourne votre forme à son état par défaut. Il suffit de placer le #ID, Class, element dans le sélecteur jQuery .

2
répondu James111 2015-06-20 04:47:36

cela a fonctionné pour moi, la réponse de pyrotex n'a pas 'réinitialiser les champs de sélection, a pris son, voici mon edit:

// Use a whitelist of fields to minimize unintended side effects.
$(':text, :password, :file', '#myFormId').val('');  
// De-select any checkboxes, radios and drop-down menus
$(':input,select option', '#myFormId').removeAttr('checked').removeAttr('selected');
//this is for selecting the first entry of the select
$('select option:first', '#myFormId').attr('selected',true);
1
répondu kertal 2011-02-15 22:43:01

J'utilise la solution Paolo Bergantino qui est super mais avec peu de retouches... Spécifiquement pour fonctionner avec le nom du formulaire à la place d'un identifiant.

par exemple:

function jqResetForm(form){
   $(':input','form[name='+form+']')
   .not(':button, :submit, :reset, :hidden')
   .val('')
   .removeAttr('checked')
   .removeAttr('selected');
}

Maintenant, quand je veux utiliser un pourrait faire

<span class="button" onclick="jqResetForm('formName')">Reset</span>

comme vous le voyez, cela fonctionne avec n'importe quel formulaire, et parce que j'utilise un style css pour créer le bouton la page ne se rafraîchira pas quand vous cliquerez. Encore une fois merci Paolo pour votre entrée. Le seul problème est que si J'ai des valeurs par défaut dans la forme.

1
répondu raphie 2011-10-13 16:06:37

j'ai utilisé la solution ci-dessous et cela a fonctionné pour moi (mélange javascript traditionnel avec jQuery)

$("#myformId").submit(function() {
    comand="window.document."+$(this).attr('name')+".reset()";
    setTimeout("eval(comando)",4000);
})
1
répondu Marcelo Martins 2011-10-28 18:53:51

Je ne suis qu'un intermédiaire en PHP, et un peu paresseux pour plonger dans un nouveau langage comme JQuery, mais ce qui suit n'est-il pas une solution simple et élégante?

<input name="Submit1" type="submit" value="Get free quote" />
<input name="submitreset" type="submit" value="Reset" />

ne peut pas voir une raison pour ne pas avoir deux boutons soumettre, juste avec des buts différents. Puis simplement:

if ($_POST['submitreset']=="Reset") {
$_source = "--Choose language from--";
$_target = "--Choose language to--"; }

vous venez de redéfinir vos valeurs à nouveau à quelque soit le défaut est censé être.

1
répondu Karel 2012-08-29 07:51:50

une méthode que j'ai utilisée sur un formulaire assez grand (plus de 50 champs) était de simplement recharger le formulaire avec AJAX, essentiellement faire un rappel au serveur et juste retourner les champs avec leurs valeurs par défaut. Ceci rendu est beaucoup plus facile que d'essayer de saisir chaque champ avec JS et de le définir à sa valeur par défaut. Il m'a également permis de garder les valeurs par défaut en un seul endroit--le code du serveur. Sur ce site, il y avait aussi des valeurs par défaut différentes selon les paramètres du compte et Je n'ai donc pas eu à m'inquiéter de les envoyer à JS. Le seul petit problème que j'ai eu à traiter était certains suggèrent des champs qui ont exigé l'initialisation après L'appel AJAX, mais pas une grosse affaire.

0
répondu Darryl Hein 2009-03-25 05:12:05

toutes ces réponses sont bonnes, mais la façon la plus facile de le faire est avec un faux reset, c'est-à-dire que vous utilisez un lien et un bouton reset.

il suffit d'ajouter quelques CSS pour cacher votre vrai bouton de réinitialisation.

input[type=reset] { visibility:hidden; height:0; padding:0;}

et ensuite sur votre lien vous ajoutez comme suit

<a href="javascript:{}" onclick="reset.click()">Reset form</a>

<input type="reset" name="reset" id="reset" /><!--This input button is hidden-->

Espérons que cette aide! A.

0
répondu André Figueira 2011-09-24 17:45:14
<script type="text/javascript">
$("#edit_name").val('default value');
$("#edit_url").val('default value');
$("#edit_priority").val('default value');
$("#edit_description").val('default value');
$("#edit_icon_url option:selected").removeAttr("selected");
</script>
0
répondu sanjay 2012-04-05 05:46:35

ici avec le rafraîchissement pour les cases à cocher et sélectionne:

$('#frm').find('input:text, input:password, input:file, textarea').val('');
$('#frm').find('input:radio, input:checkbox').attr("checked",false).checkboxradio("refresh");
$('#frm').find('select').val('').selectmenu('refresh');
0
répondu dutchman711 2012-12-19 19:29:53

j'ai eu le même problème et le poste de Paolo m'a aidé, mais j'avais besoin de régler une chose. Mon formulaire avec id advancedindexsearch ne contenait que des champs d'entrée et obtient les valeurs d'une session. Pour une raison quelconque, le suivant ne fonctionne pas pour moi:

$("#advancedindexsearch").find("input:text").val("");

si je mets une alerte après cela, je vois que les valeurs ont été enlevées correctement mais ensuite elles ont été remplacées à nouveau. Je ne sais toujours pas comment ou pourquoi mais la ligne suivante a fait le tour pour moi:

$("#advancedindexsearch").find("input:text").attr("value","");
0
répondu gizmo753 2013-02-08 09:36:00

Paolo réponse ne tient pas compte de sélecteurs de date, d'ajouter:

$form.find('input[type="date"]').val('');
0
répondu LowGain 2013-12-10 05:12:19

j'ai fait un peu d'amélioration sur Paolo Bergantino d'origine de réponse

function resetFormInputs(context) {
    jQuery(':input', context)
    .removeAttr('checked')
    .removeAttr('selected')
    .not(':button, :submit, :reset, :hidden')
    .each(function(){
         jQuery(this).val(jQuery(this).prop('defautValue'));
    });
}

De cette façon, je peux passer n'importe quel élément de contexte à la fonction. Je suis capable de réinitialiser le formulaire entier ou seulement un certain ensemble de champs, par exemple:

resetFormInputs('#form-id'); // entire form
resetFormInputs('.personal-info'); // only the personal info field set

Plus, les valeurs par défaut des entrées sont conservées.

0
répondu berosoboy 2014-06-16 20:28:55

voici ma solution, qui fonctionne aussi avec les nouveaux types d'entrée html5:

/**
 * removes all value attributes from input/textarea/select-fields the element with the given css-selector
 * @param {string} ele css-selector of the element | #form_5
 */
function clear_form_elements(ele) {
    $(ele).find(':input').each(function() {
        switch (this.type) {
            case 'checkbox':
            case 'radio':
                this.checked = false;
            default:
                $(this).val('');
                break;
        }
    });
}
0
répondu pubkey 2014-08-26 21:30:08
$(this).closest('form').find('input,textarea,select').not(':image').prop('disabled', true);
-1
répondu mmm 2013-12-24 12:58:03