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?
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?
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); //
}
If more advanced validation is needed I recommend using plugging for jQuery validations
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.
//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
.
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);
});
});