Limpar campos de formulário com jQuery

402

Quero limpar todos os campos de entrada e área de texto de um formulário. Funciona da seguinte maneira ao usar um botão de entrada com a resetclasse:

$(".reset").bind("click", function() {
  $("input[type=text], textarea").val("");
});

Isso limpará todos os campos da página, não apenas os do formulário. Como seria o meu seletor exatamente como o botão de redefinição atual está localizado?

tbuehlmann
fonte
Confira a resposta por Paolo Bergantino stackoverflow.com/questions/680241/blank-out-a-form-with-jquery
mau Coder
2
Método mais detalhado para redefinir um formulário aqui .
Uzbekjon

Respostas:

487
$(".reset").click(function() {
    $(this).closest('form').find("input[type=text], textarea").val("");
});
ShaneBlake
fonte
49
Não esqueça seus input[type=password]campos.
SammyK
64
Esta resposta cobre a pergunta original. Aqueles que querem mais do que apenas campos de texto irá, obviamente, precisa adicionar código conforme necessário ...
ShaneBlake
2
lembre-se também de que haverá mais tipos de entradas além de type = password (como disse SammyK) no HTML5: type = url, type = digits, type = email, etc http://www.w3.org/TR/html5/forms .html # state-of-the-type-attribute
Gabriel
6
Uma pequena dica: esse seletor não seleciona elementos de entrada que dependem do tipo implícito = texto, você deve incluir explicitamente o tipo = texto na sua marcação. Isso pode ser óbvio, mas não era para mim, só agora :-)
Elbin
2
@CaptSaltyJack: que redefine-los para os valores padrão que não é a mesma coisa que limpá-los ...
ShaneBlake
628

Para o jQuery 1.6+ :

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

Para jQuery <1.6 :

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

Consulte este post: Redefinindo um formulário de vários estágios com jQuery

Ou

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

Como o jQuery sugere :

Para recuperar e alterar as propriedades de DOM, tal como o checked, selectedou disabledestado de elementos de forma, utilizar o .prop () método.

ngen
fonte
3
O primeiro trecho de código definirá os valores das caixas de seleção como "" em vez de apenas desmarcá-las. E isso não afetará as seleções, porque são as tags de opção que são selecionadas.
6
para evitar a remoção de valores de caixa de seleção, eu usei o seguinte, inspirado por sua resposta: $(':input').not(':button, :submit, :reset, :hidden').removeAttr('checked').removeAttr('selected').not(':checkbox, select').val('').removeAttr('value');. Ela irá remover valores padrão (ou seja value="something", mas não para caixas de seleção ou seleciona.
Jeppe Mariager-Lam
17
NÃO USE ISTO (opção 1) se você tiver rádios, caixas de seleção ou seleções, você perderá muito tempo encontrando um bug estranho depois que seus valores desaparecerem. A versão correta, o que deixa seus valores intactos: $(':input').not(':button, :submit, :reset, :hidden').removeAttr('checked').removeAttr('selected').not(':checkbox, :radio, select').val('');(baseado no comentário do Jeppe Mariager-Lam)
Konstantin Pereiaslov
8
Algum motivo para evitar a segunda opção?
19614 rineez
6
sua segunda solução é a resposta real
abzarak
159

Alguma razão para isso não ser usado?

$("#form").trigger('reset');
user768680
fonte
17
@ pythonian29033: e com sua abordagem, você redefinirá TODOS os formulários da página para os padrões ... o que definitivamente NÃO é o que um desenvolvedor normal deseja. Eu acho que um desenvolvedor jQuery deve tomar conhecimento do fato de que ele / ela precisa mudar o seletor de um código de exemplo para o apropriado ...
Sk8erPeter
8
@ Sk8erPeter Se você possui vários elementos na página com ID form, está fazendo algo errado. Você estaria certo se o seletor fosse form, mas é o seletor de ID #form.
brandones
@brandones: Você deveria ter prestado atenção ao que estava respondendo, porque está errado ... :) Verifique o código que pythonian29033 escreveu (ao qual eu respondi anteriormente): $("form").trigger('reset');realmente aciona o evento "reset" em TODOS os <form>elementos. Na maioria dos casos, pode estar errado. Mas $("#form").trigger('reset');(mostrado na resposta original) somente aciona o evento "reset" no elemento que possui o ID de "formulário" definido (acessível com o #formseletor). E sim, um id deve ser usado apenas uma vez, é por isso que eles chamam de "id", porque identifica um elemento inequivocamente.
precisa saber é o seguinte
61

Isso não trata dos casos em que os campos de entrada do formulário têm valores padrão não vazios.

Algo como deve funcionar

$('yourdiv').find('form')[0].reset();
parapura rajkumar
fonte
Eu só tenho o código js do meu primeiro post e quero que ele funcione em cada página com vários botões de redefinição de várias formas. Portanto, é apenas o seletor que precisa de alguma contribuição.
tbuehlmann
51

se você usar seletores e transformar valores em valores vazios, ele não redefinirá o formulário, mas todos os campos em branco. Redefinir é criar o formulário como antes de qualquer ação de edição do usuário após o carregamento do formulário do lado do servidor. Se houver uma entrada com o nome "nome de usuário" e esse nome de usuário tiver sido pré-preenchido do lado do servidor, a maioria das soluções nesta página excluirá esse valor da entrada, não o redefinirá para o valor que era antes da alteração do usuário. Se você precisar redefinir o formulário, use o seguinte:

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

se você não precisar redefinir o formulário, mas preencher todas as entradas com algum valor, por exemplo, valor vazio, poderá usar a maioria das soluções de outros comentários.

Lukas Liesis
fonte
29

Simples, mas funciona como um encanto.

$("#form").trigger('reset'); //jquery
document.getElementById("myform").reset(); //native JS
jroi_web
fonte
14
Exceto que não limpa os campos. Ele define os padrões.
Mark Fraser
29

Se alguém ainda estiver lendo este tópico, aqui está a solução mais simples, usando não jQuery, mas JavaScript simples. Se seus campos de entrada estiverem dentro de um formulário, existe um comando simples de redefinição de JavaScript:

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

Saiba mais aqui: http://www.w3schools.com/jsref/met_form_reset.asp

Felicidades!

Tarmo Saluste
fonte
Como diz. Ele redefine o valor da forma inicial e não esvazia os valores. Mas sim, se você carregou o formulário com valores padrão, eles não serão limpos. Provavelmente um loop JS que vai calha de todas as entradas e as limpa
Tarmo Saluste
21
$('form[name="myform"]')[0].reset();
uma caneta
fonte
17

Por que ele precisa ser feito com JavaScript?

<form>
    <!-- snip -->
    <input type="reset" value="Reset"/>
</form>

http://www.w3.org/TR/html5/the-input-element.html#attr-input-type-keywords


Tentei isso primeiro, ele não limpará os campos com valores padrão.

Aqui está uma maneira de fazer isso com o jQuery:

$('.reset').on('click', function() {
    $(this).closest('form').find('input[type=text], textarea').val('');
});
Matt Ball
fonte
11
Tentei isso primeiro, ele não limpará os campos com valores padrão.
tbuehlmann
Há outro motivo pelo qual você frequentemente precisa de JavaScript para este. O formulário pode não ser um "formulário". Por exemplo, seu formulário é realmente apenas uma coleção de entradas para um aplicativo Backbone.js / Ember.js / AngularJS e os dados nunca serão enviados como um formulário tradicional para o servidor, mas precisam ser processados ​​estritamente no lado do cliente JavaScript. Em casos como este, não há forma de redefinição para trabalhar.
John Munsch
3
.live()está obsoleto e também é lento / desnecessário. Você poderia apenas usar .bind()ou .on().
precisa
14

Se você deseja esvaziar todas as caixas de entrada, independentemente do seu tipo, é um minuto passo a passo

 $('#MyFormId')[0].reset();
Rashi Goyal
fonte
12

Tenho o truque mais fácil para redefinir o formulário

jQuery("#review-form")[0].reset();

ou

$("#review-form").get().reset();
mumair
fonte
12

Com Javascript, você pode simplesmente fazê-lo com esta sintaxe getElementById("your-form-id").reset();

você também pode usar o jquery chamando a função reset dessa maneira $('#your-form-id')[0].reset();

Lembre-se de não esquecer [0]. Você receberá o seguinte erro se

TypeError: $ (...). Reset não é uma função

O JQuery também fornece um evento que você pode usar

$ ('# form_id'). trigger ("redefinir");

Eu tentei e funciona.

Nota: É importante observar que esses métodos somente redefinem seu formulário para o valor inicial definido pelo servidor no carregamento da página. Isso significa que, se sua entrada foi definida no valor 'valor definido' antes de você fazer uma alteração aleatória, o campo será redefinido para o mesmo valor depois que o método de redefinição for chamado.

Espero que ajude

BoCyrill
fonte
7
$('#editPOIForm').each(function(){ 
    this.reset();
});

onde editPOIFormé o idatributo do seu formulário.

Servir conhecimento
fonte
2
Sempre haverá um #editPOIForme, portanto, o .each()método não faz sentido. Mesmo se você adicionasse esse ID a vários formulários, ele retornaria apenas um deles.
precisa
11
O each () permite que você use isso (em vez de $ (this)) para acessar o objeto DOM subjacente e chame reset (). Supondo que você deseja redefinir os valores padrão, em vez de limpar tudo, esta é uma boa solução.
Dave
@Dave Poderia também usar #$('#editPOIForm').get(0).reset();
Thomas Daugaard
2
@ThomasDaugaard: exceto que se você usar get (0) ou simplesmente $ ('# editPOIForm') [0], receberá um erro de script se $ ('# editPOIForm') não corresponder a nenhum elemento, enquanto que cada () falhará sem um erro. Portanto, suponho que depende de suas prioridades no que diz respeito ao tratamento de erros.
Dave
6

Por que você não usa document.getElementById("myId").reset();? este é o simples e bonito

Carlos Alvarez
fonte
6

Código testado e verificado:

  $( document ).ready(function() {
    $('#messageForm').submit(function(e){
       e.preventDefault();
    });
    $('#send').click(function(e){
      $("#messageForm")[0].reset();
    });
  });

Javascript deve estar incluído $(document).readye deve estar com sua lógica.

DeepCode
fonte
5

A solução mais fácil e melhor é
$("#form")[0].reset();

Não use aqui -
$(this)[0].reset();

Mamun Sabuj
fonte
Apenas um pequeno aviso: se você tiver valores padrão para as entradas, digamos renderizados pelo servidor, form.reset();será redefinido para esses valores e não limpará as entradas.
Evil_Bengt
4

Digamos que, se você deseja limpar os campos e, exceto, accountType, na caixa suspensa de tempo médio será redefinida para um valor específico, ou seja, 'Todos' .Os campos restantes devem ser redefinidos para vazios, ou seja, caixa de texto. campos específicos como nossa exigência.

 $(':input').not('#accountType').each( function() {

    if(this.type=='text' || this.type=='textarea'){
             this.value = '';
       }
    else if(this.type=='radio' || this.type=='checkbox'){
         this.checked=false;
      }
         else if(this.type=='select-one' || this.type=='select-multiple'){
              this.value ='All';
     }
 });
Gnanasekaran Ebinezar
fonte
Resposta mais completa. Obrigado.
RationalRabbit
Uma pergunta: como você direcionaria isso para um formulário específico, se estivesse fazendo isso de forma programática, em vez de clicar com o botão?
RationalRabbit
4

Eu uso isso :

$(".reset").click(function() {
  $('input[type=text]').each(function(){
     $(this).val('');
  });
});

E aqui está o meu botão:

<a href="#" class="reset">
  <i class="fa fa-close"></i>
     Reset
</a>
Matheno
fonte
Há uma redefinição tipo de entrada disponíveis w3.org/TR/html-markup/input.reset.html
Thomas Welton
3

Use este código onde você deseja chamar a função de redefinição normal por jQuery

setTimeout("reset_form()",2000);

E escreva esta função para fora do site jQuery no documento pronto

<script>
function reset_form()
{
    var fm=document.getElementById('form1');
    fm.reset();
}
</script>
Monzur
fonte
3

Alguns de vocês estavam reclamando que os rádios estão sem o status "marcado" padrão ... Tudo o que você precisa fazer é adicionar os seletores: radio,:: ao .not e o problema foi resolvido.

Se você não conseguir que todas as outras funções de redefinição funcionem, essa funcionará.

  • Adaptado da resposta da ngen

    function form_reset(formID){
        $(':input','#'+formID)
        .not(':button',':submit',':reset',':hidden',':radio',':checkbox')
        .val('');
    }
Gregory Bowers
fonte
2
@using (Ajax.BeginForm("Create", "AcceptanceQualityDefect", new AjaxOptions()
{
    OnSuccess = "ClearInput",
    HttpMethod = "Post",
    UpdateTargetId = "defect-list",
    InsertionMode = InsertionMode.Replace
}, new { @id = "frmID" })) 
  1. frmID é a identificação do formulário
  2. OnSuccessda operação, chamamos a função JavaScript com o nome " ClearInput"

    <script type="text/javascript">
        function ClearInput() {
            //call action for render create view
            $("#frmID").get(0).reset();
        }
    </script>
  3. se você fizer as duas coisas corretamente, não poderá impedir que funcione ...

LWC Nirosh
fonte
1

O código a seguir limpa todo o formulário e seus campos estarão vazios. Se você deseja limpar apenas um formulário específico, se a página tiver mais de um formulário, mencione o ID ou a classe do formulário

$("body").find('form').find('input,  textarea').val('');
shivaP
fonte
0

Se eu quiser limpar todos os campos, exceto accountType ... Use o seguinte

$q(':input','#myform').not('#accountType').val('').removeAttr('checked').removeAttr('selected');
Gnansekaran Ebinezar
fonte
11
você não quer perder os valores para as caixas en radiobuttons, mas apenas desmarcá-los, esta não é uma boa solução
Frankey
0

o código que vejo aqui e em questões relacionadas ao SO parece incompleto.

Redefinir um formulário significa definir os valores originais do HTML, então montei isso para um pequeno projeto que estava realizando com base no código acima:

            $(':input', this)
                .not(':button, :submit, :reset, :hidden')
                .each(function(i,e) {
                    $(e).val($(e).attr('value') || '')
                        .prop('checked',  false)
                        .prop('selected', false)
                })

            $('option[selected]', this).prop('selected', true)
            $('input[checked]',   this).prop('checked',  true)
            $('textarea',         this).each(function(i,e) { $(e).val($(e).html()) })

Informe-me se estiver faltando alguma coisa ou algo pode ser melhorado.

Rafael Kitover
fonte
0

Nenhuma das opções acima funciona em um caso simples quando a página inclui uma chamada para o controle do usuário da web que envolve o processamento de solicitação IHttpHandler (captcha). Depois de enviar o requsrt (para processamento de imagem), o código abaixo não limpa os campos no formulário (antes de enviar a solicitação HttpHandler), tudo funciona corretamente.

<input type="reset"  value="ClearAllFields" onclick="ClearContact()" />

 <script type="text/javascript">
       function ClearContact() {
           ("form :text").val("");
       }
    </script>
user2366666
fonte
0

Eu escrevi um plugin jQuery universal:

/**
 * Resets any input field or form
 */
$.fn.uReset = function () {
    return this.filter('form, :input').each(function () {
        var input = $(this);
        
        // Reset the form.
        if (input.is('form')) {
            input[0].reset();
            return;
        }

        // Reset any form field.
        if (input.is(':radio, :checkbox')) {
            input.prop('checked', this.defaultChecked);
        } else if (input.is('select')) {
            input.find('option').each(function () {
                $(this).prop('selected', this.defaultSelected);
            });
        } else if (this.defaultValue) {
            input.val(this.defaultValue);
        } else {
            console.log('Cannot reset to default value');
        }
    });
};

$(function () {
    // Test jQuery plugin.
    $('button').click(function (e) {
        e.preventDefault();
        
        var button = $(this),
            inputType = button.val(),
            form = button.closest('form');
        
        if (inputType === 'form') {
            form.uReset()
        } else {
            $('input[type=' + inputType + '], ' + inputType, form).uReset();
        }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h3>Form</h3>
<form>
    <input type="text" value="default"/><br /><br />
    Ch 1 (default checked) <input type="checkbox" name="color" value="1" checked="checked" /><br />
    Ch 2 <input type="checkbox" name="color" value="2" /><br />
    Ch 3 (default checked) <input type="checkbox" name="color" value="3" checked="checked" /><br /><br />
    <select name="time"><br />
        <option value="15">15</option>
        <option selected="selected" value="30">30</option>
        <option value="45">45</option>
    </select><br /><br />
    R 1 <input type="radio" name="color" value="1" /><br />
    R 2 (default checked) <input type="radio" name="color" value="2" checked="checked" /><br />
    R 3 <input type="radio" name="color" value="3" /><br /><br />
    <textarea>Default text</textarea><br /><br />
    
    <p>Play with form values and then try to reset them</p>
    
    <button type="button" value="text">Reset text input</button>
    <button type="button" value="checkbox">Reset checkboxes</button>
    <button type="button" value="select">Reset select</button>
    <button type="button" value="radio">Reset radios</button>
    <button type="button" value="textarea">Reset textarea</button>
    <button type="button" value="form">Reset the Form</button>
</form>

Jekis
fonte
-2

Adicione o botão de redefinição oculto da seguinte maneira

<input id="resetBtn" type="reset" value="reset" style="display:none" />
// Call reset buttons click event
// Similar to ClearInputs('resetBtn');
function ClearInputs(btnSelector) {
     var btn = $("#" + btnSelector);
     btn.click();
}
Jayan.CA
fonte
-4

$ ('form'). submit (function () {

var el = $(this);

$('<button type="reset" style="display:none; "></button>')
    .appendTo(el)
    .click()
    .remove()
;

return false;

});

Júnior Mendonça
fonte