Skip to content

Instantly share code, notes, and snippets.

@sayhicoelho
Last active July 5, 2018 05:08
Show Gist options
  • Save sayhicoelho/d37c885154b7d20ce0fb20c5d6d127f6 to your computer and use it in GitHub Desktop.
Save sayhicoelho/d37c885154b7d20ce0fb20c5d6d127f6 to your computer and use it in GitHub Desktop.
Consulta dados de um endereço com seu CEP.
// 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