Last active
July 5, 2018 05:08
-
-
Save sayhicoelho/d37c885154b7d20ce0fb20c5d6d127f6 to your computer and use it in GitHub Desktop.
Consulta dados de um endereço com seu CEP.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Este script requer a função selectBoxByText do arquivo sayhicoelho/utils.js | |
// https://gist.github.com/sayhicoelho/be058ba559cba22b207a64c1113ff1bf | |
$(function () { | |
var request; | |
var timeout; | |
var campos = [ | |
'logradouro', | |
'bairro', | |
'cidade', | |
]; | |
// Atualiza o valor de um campo | |
function popula_campo(element_id, val) { | |
$('#' + element_id).val(val); | |
} | |
// Desabilita um campo | |
function set_disabled(element_id, disabled) { | |
$('#' + element_id).prop('disabled', disabled); | |
} | |
// Desabilita todos os campos do array "campos" | |
function desabilita_campos() { | |
for (var i = 0; i < campos.length; i++) { | |
set_disabled(campos[i], true); | |
} | |
} | |
// Habilita todos campos do array "campos" | |
function habilita_campos() { | |
for (var i = 0; i < campos.length; i++) { | |
set_disabled(campos[i], false); | |
} | |
} | |
// Informa o campo com algum text | |
function set_label(element, message, type = null) { | |
var span = '<span class="help-block">' + | |
'<strong>' + message + '</strong>' + | |
'</span>'; | |
element.parent().find('.help-block').remove(); | |
element.parent().addClass(type).append(span); | |
} | |
// Informa um erro no campo | |
function set_error(element, message) { | |
set_label(element, message, 'has-error'); | |
} | |
// Limpa erro do .form-group | |
function limpa_erro(input) { | |
$(input).closest('.form-group').removeClass('has-error').find('.help-block').remove(); | |
} | |
// Limpa todos erros do array "campos" | |
function limpa_erros() { | |
for (var i = 0; i < campos.length; i++) { | |
limpa_erro('#' + campos[i]); | |
} | |
} | |
// Desativa campos do formulário de cep. | |
function desativa_formulario_cep() { | |
$('#uf_id').prop('disabled', true); | |
desabilita_campos(); | |
} | |
// Limpa valores do formulário de cep. | |
function limpa_formulário_cep() { | |
$('#uf_id').prop('disabled', false); | |
habilita_campos(); | |
} | |
// Evento que é acionado quando uma tecla deixa de ser pressionada | |
$('#cep').keyup(function (e) { | |
// Guarda o elemento atual em uma variável para ser utilizado em algum escopo assíncrono | |
$this = $(this); | |
// Verifica se uma tecla numérica foi pressionada | |
if ((e.which >= 48 && e.which <= 57) || (e.which >= 96 && e.which <= 105)) { | |
// Nova variável "cep" somente com dígitos. | |
var cep = $(this).val().replace(/\D/g, ''); | |
// Verifica se campo cep possui valor informado. | |
if (cep != "") { | |
// Expressão regular para validar o cep. | |
var validacep = /^[0-9]{8}$/; | |
// Valida o formato do cep. | |
if (validacep.test(cep)) { | |
// Limpa erros e desabilita os campos referentes ao CEP | |
limpa_erros(); | |
limpa_erro($this); | |
desativa_formulario_cep(); | |
// Cancela a última requisição | |
if (request) { | |
request.abort(); | |
} | |
// Cancela o último timeout | |
if (timeout) { | |
clearTimeout(timeout); | |
} | |
// Adiciona um timeout para a próxima requisição | |
timeout = setTimeout(function () { | |
limpa_formulário_cep(); | |
set_error($this, 'Não foi possível buscar por este CEP. Por favor, tente novamente.'); | |
$this.focus(); | |
}, 5000); | |
// Consulta o webservice receitaws.com.br/ | |
request = $.getJSON("//viacep.com.br/ws/" + cep + "/json/?callback=?", function (dados) { | |
// Cancela o último timeout, caso uma nova requisição foi bem sucedida | |
clearTimeout(timeout); | |
if (!("erro" in dados)) { | |
// Atualiza os campos com os valores da consulta. | |
for (var i = 0; i < campos.length; i++) { | |
switch (campos[i]) { | |
case "cidade": | |
popula_campo(campos[i], dados.localidade); | |
break; | |
default: | |
popula_campo(campos[i], dados[campos[i]]); | |
} | |
} | |
// Seleciona UF | |
selectBoxByText(dados.uf, document.getElementById('uf_id')); | |
$('#uf_id').prop('disabled', false).trigger('change'); | |
// Limpa erros (se houver) | |
limpa_erros(); | |
limpa_erro($this); | |
habilita_campos(); | |
$('#numero').select(); | |
} // end if. | |
else { | |
// cep pesquisado não foi encontrado. | |
limpa_formulário_cep(); | |
set_error($this, 'Este CEP não foi encontrado em nossa base de dados.'); | |
$this.focus(); | |
} | |
}); | |
} // end if. | |
else { | |
// cep é inválido. | |
limpa_formulário_cep(); | |
} | |
} // end if. | |
else { | |
// cep sem valor, limpa formulário. | |
limpa_formulário_cep(); | |
} | |
} | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment