A biblioteca JQuery já nos facilita bastante a fazer requisições AJAX. Porém, sempre que enviamos um formulário via AJAX, normalmente é necessário armazenar todos os campos em variáveis para então enviar ao servidor. O jQuery Form Plugin é um plugin que tem o objetivo de facilitar ainda mais esse processo. Basicamente, ao enviar um formulário, o plugin armazena as informações de cada elemento do formulário e envia ao servidor utilizando AJAX. Para exemplificar seu uso, vamos criar um formulário bem simples.
O formulário
<form id="formulario" method="post" action="enviar.php" role="form">
<legend>Formulário</legend>
<div class="form-group">
<label>Nome</label>
<input class="form-control" type="text" name="nome" required autofocus/>
</div>
<div class="form-group">
<label>Email</label>
<input class="form-control" type="email" name="email" required/>
</div>
<div class="form-group">
<label>Mensagem</label>
<textarea class="form-control" name="mensagem" rows="5" required></textarea>
</div>
<input id="enviar" class="btn btn-primary" type="submit" value="Enviar" data-loading-text="Enviando..."/>
</form>
Requisição AJAX Comum
Se clicarmos em enviar no formulário acima, os dados serão enviados para o arquivo enviar.php de forma convencional. Se quisermos enviar utilizando AJAX, ou seja, sem a necessidade de recarregar a página, normalmente fazemos assim:
// Quando enviado o formulário
$('#formulario').on('submit', function () {
// Armazenando informações do formulário em variáveis
var nome = $("input[name=nome]").val();
var email = $("input[name=email]").val();
var mensagem = $("textarea[name=mensagem]").val();
// Fazendo requisição AJAX
$.post(this.action, {nome: nome, email: email, mensagem: mensagem}, function (resposta) {
console.log(resposta);
});
// Retorna FALSE para que o formulário não seja enviado de forma convencional
return false;
});
Requisição AJAX com Plugin
Com o plugin simplesmente utilizamos o método ajaxForm(). O plugin irá “mapear” todos os campos do formulário e enviar automaticamente para a action definida no formulário, no nosso caso para o arquivo enviar.php.
// Quando enviado o formulário
$('#formulario').ajaxForm(function (resposta) {
console.log(resposta);
});
Se a requisição for um sucesso, exibiremos a resposta no console de navegador. Simples, não?
O lado servidor
Apenas para verificar se deu tudo certo, vamos criar o nosso arquivo enviar.php, que vai nos retornar os dados que foram enviados em formato JSON.
<?php // Apenas retornando o que foi recebido echo json_encode($_POST);Em ambos os casos, veremos o mesmo resultado no console do navegador, por exemplo:
{"nome":"Rafael Couto","email":"rafaelcouto@outlook.com","mensagem":"Hello world!"}
Portanto, com ou sem plugin os dados foram recebidos pelo servidor para que possam sem manipulados (gravar no banco de dados, enviar por email, etc.). Porém a implementação com o plugin é muito mais simples e elegante.
Avançado
Vimos um exemplo bem simples, porém o plugin tem várias opções para requisições mais avançadas.
Chamando de um evento
Às vezes é necessário tratar alguma informação ou manipular algum objeto antes de enviar o formulário. Um exemplo é mostrar um indicador de carregamento:
// Quando enviado o formulário
$('#formulario').on('submit', function () {
// Armazenando objeto do botão para utilizá-lo posteriormente
var botao = $('#enviar');
// Exibindo indicador de carregamento (Bootstrap)
// Docs: http://getbootstrap.com/javascript/#buttons
botao.button('loading');
// Enviando formulário
$(this).ajaxSubmit({
// Se enviado com sucesso
success: function (resposta) {
// Exibindo resposta do servidor
console.log(resposta);
// Escondendo indicador de carregamento
botao.button('reset');
},
// Se acontecer algum erro
error: function () {
// Escondendo indicador de carregamento
botao.button('reset');
}
});
// Retorna FALSE para que o formulário não seja enviado de forma convencional
return false;
});
Em resumo, quando o usuário clicar no botão de enviar, exibimos a mensagem de carregamento no botão e então enviamos o formulário utilizando o método ajaxSubmit() do plugin. Se enviado com sucesso ou ocorrer algum erro no servidor, escondemos a mensagem de carregamento do botão.
Tratar informações
É possível também manipular ou tratar as informações antes de enviar. Um exemplo seria uma validação do lado cliente:
// Quando enviado o formulário
$('#formulario').ajaxForm({
// Antes de enviar o formulário
beforeSubmit: function (data, form, options) {
// Passando pelos campos do formulário
for (var i = 0; i < data.length; i++) {
// Se for o campo nome
if (data[i].name == 'nome') {
// Verificamos se possui pelo menos 5 caracteres
if (data[i].value.length < 5) {
// Exibindo mensagem
alert('O nome deve ter pelo menos 5 caracteres');
// Retornando false para que o plugin não envie o formulário
return false;
}
}
}
}
});
Em resumo, antes do formulário ser enviado, passamos pelos campos do formulário que foram armazenados na variável data pelo plugin. Se for o campo do nome, verifica se o valor desse campo possui pelo menos cinco caracteres, caso não possua exibe um alerta e diz para o plugin não enviar o formulário.
Arquivos
Uma coisa muito interessante é que o plugin também envia os campos do tipo file. Ou seja, todo o trabalho para enviar um arquivo via AJAX é feito pelo plugin. Basicamente, funciona da mesma forma que os exemplos anteriores, por exemplo:
<form id="formulario" method="post" action="upload.php" role="form">
<legend>Formulário</legend>
<div class="form-group">
<label>Arquivo</label>
<input class="form-control" type="file" name="arquivo" />
</div>
<input id="enviar" class="btn btn-primary" type="submit" value="Enviar" />
</form>
// Quando enviado o formulário
$('#formulario').ajaxForm(function (resposta) {
console.log(resposta);
});
<?php // Apenas retornando o que foi recebido echo json_encode($_FILES);
Outras opções
O plugin também possui várias outras opções que podem ser utilizadas na requisição, como por exemplo:// Quando enviado o formulário
$('#formulario').ajaxForm({
// Tipo do retorno (XML, JSON ou SCRIPT)
dataType: 'JSON',
// Tipo de envio (POST ou GET)
type: 'POST',
// Tempo máximo de espera do retorno (milisegundos)
timeout: 10000,
// Método que será chamando quando a requisição for realizada com sucesso
success: function(resposta)
{
console.log(resposta);
},
// Método que será chamado quando houver algum erro na requisição
// Seja algum erro no servidor ou então estourar o TIMEOUT
error: function()
{
console.log('Oops, ocorreu um errro.');
}
});
Conclusão
O jQuery Form Plugin facilita muito as requisições AJAX, principalmente quando trabalhamos com formulários que possuem vários campos de diferentes tipos. Nos exemplos, vimos basicamente envio de campos texto, porém é possível enviar qualquer outro tipo como checkbox, radio, file, hidden, etc. Enfim, é um plugin que normalmente utilizo em meus projetos e espero que lhe seja útil também.
Código fonte disponível em: https://github.com/rafaelcouto/facilitando-requisicoes-ajax-com-jquery-form-plugin
Referências
- Alsup, Mike. jQuery Form Plugin. Disponível em <http://malsup.com/jquery/form>. Acesso em 19 de abril de 2015.