How do I enable a button only when all inputs are filled?

11

I have a <button> that is rendered as disabled (disabled) when the page is initially loaded.

I would like it to be enabled (enabled) when all data is filled in <input> 's. How could I do this using jQuery?

    
asked by anonymous 21.02.2014 / 12:41

4 answers

11

The answer gets a bit general without having specific code in the question.

But here's a suggestion:

EDIT: I put a more modern version, the original version is below:

var inputs = $('input').on('keyup', verificarInputs);
function verificarInputs() {
    const preenchidos = inputs.get().every(({value}) => value)
    $('button').prop('disabled', !preenchidos);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><inputtype="text" />
<input type="text" />
<input type="text" />
<button type="button" id="botao" disabled="disabled">Botão</button>

Original answer:

// Mantém os inputs em cache:
var inputs = $('input');

// Chama a função de verificação quando as entradas forem modificadas
// Usei o 'keyup', mas 'change' ou 'keydown' são também eventos úteis aqui
inputs.on('keyup', verificarInputs);

function verificarInputs() {
    var preenchidos = true;  // assumir que estão preenchidos
    inputs.each(function () {
        // verificar um a um e passar a false se algum falhar
        // no lugar do if pode-se usar alguma função de validação, regex ou outros
        if (!this.value) {
          preenchidos = false;
          // parar o loop, evitando que mais inputs sejam verificados sem necessidade
          return false;
        }
    });
    // Habilite, ou não, o <button>, dependendo da variável:
    $('button').prop('disabled', !preenchidos); // 
}

Example

If more advanced validation is needed I recommend using plugging for jQuery validations

    
21.02.2014 / 12:50
2

Try something like this, for example:

$(document).ready(function (){
    validate();
    $('#nome, #email, #telefone').change(validate);
});

function validate(){
    if ($('#nome').val().length > 0 &&
        $('#email').val().length > 0 &&
        $('#telefone').val().length > 0) {
        $("input[type=submit]").prop("disabled", false);
    }
    else {
        $("input[type=submit]").prop("disabled", true);
    }
}

Validation occurs when you focus the field.

JSFiddle

    
21.02.2014 / 12:47
2
//funcao que permite a verificacao atravez de um seletor customizavel    
function isAnyEmpty(el){
    var isEmpty = false, v;
    el.each(function(e){
        v = $(this).val();
        if(v == "" || v == null || v == undefined){
            isEmpty = true
        }
    });
    return isEmpty;
}

How to use:

//use um seletor a sua escolha
var el = $('.meuformulario input[type="text"]');
el.on('keyup',function(){
    $('button').prop('disabled',isAnyEmpty(el));
});

In this way you can reuse the function in any block of elements by filtering with selectors, in addition to being able to use in conjunction with other elements, such as textarea .

VER FIDDLE

    
21.02.2014 / 15:07
2

I've implemented a solution that works with input , textarea and select . I will iterate the elements only once in page-load , and assign the events that may by chance change the value of an input, textarea or select: change keyup mouseup .

Script

$(function () {
    // vou pegar apenas os controles que estiverem dentro do form especificamente
    // pois podem haver mais outros forms ou controles em outros locais, os quais
    // não desejo afetar
    var $inputs = $("input, textarea, select", "#formName"),
        $button = $("#botao");

    var limpos = 0;

    // contagem inicial de valores não preenchidos
    $inputs.each(function () {
        var $this = $(this);
        var val = $this.val();
        val || limpos++;
        $this.data("val-antigo", val);
    });

    $button.prop("disabled", !!limpos);

    // agora só vamos ouvir eventos específicos, e alterar a quantidade de limpos
    // quando um valor for alterado... não vamos mais iterar pelos controles
    $inputs.on("change keyup mouseup", function () {
        var $this = $(this);
        var val = $this.val();
        limpos += (val ? 0 : 1) - ($this.data("val-antigo") ? 0 : 1);
        $this.data("val-antigo", val);
        $button.prop("disabled", !!limpos);
    });
});

Example in jsfiddle

    
21.02.2014 / 14:49