Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Eu tenho um evento, que dispara um função indicando qual é o' $this' do evento, essa função dispara uma requisição ajax, e com base nessa resposta do ajax, eu defino qual ação vai ser executada. algo como isso:
//Evento de disparo
$(document).on('click', '.elemento', function () {
//Passando este elemento, para o interactor
$this = $(this);
//Metodo callback simulado, passando o elemento disparador como $this.
metodo_da_requisicao($this, function (data) {
//Coisas a ser fazer com a resposta data;
}
});function metodo_da_requisicao($this,callback) {
var dados = 'informação';
$.ajax({
//Define o método, OBRIGATORIAMENTE POTS
type: "POST",
//Define o arquivo do caller
url: "caller.php",
//Define os dados a serem transmitidos ao caller
data: dados,
//Define o formato da resposta, OBRIGATORIAMENTE JSON
dataType: 'json',
//Define para sucesso da transmissão ->
success: function (data)
{
//Aqui devolve pra chamada do método no evento disparador.
callback(data);
}
});
}
Isso é necessário porque o método da requisição, é global, todos os eventos usam o mesmo método, possuem o mesmo formato de leitura de resposta.
Fiz assim porque não consigo retirar o retorno do ajax de dentro da resposta dele, nem com window.variavel , de nenhum outro jeito, o 'data' sai da requisição.
É correto usar desse modo ?Pena que a maioria dos respostas de coisas que não são muito corriqueiras estão em inglês, leva um bom tempo pra entender direitinho kk
Acho que no caso que eu to usando não da pra não passar o $this pelo parametro, eu preciso do $(this) livre, pois a primeira etapa antes da requisição é dando um loop pelos elementos '.input_field', e esses elementos eu encontro com um $this.closest('form').find('.input_field'), e aí o $(this) precisa estar livra pra interagir dentro do loop, mas vou tentar dessa forma que me indicou.
Obrigadão @Gabriel Heming!!>
3 minutos atrás, AnthraxisBR disse:
Acho que no caso que eu to usando não da pra não passar o $this pelo parametro, eu preciso do $(this) livre, pois a primeira etapa antes da requisição é dando um loop pelos elementos '.input_field', e esses elementos eu encontro com um $this.closest('form').find('.input_field'), e aí o $(this) precisa estar livra pra interagir dentro do loop, mas vou tentar dessa forma que me indicou.
Isso não fez muito sentido pra mim.Tipo, eu recebo o pedido da requisição, aí faz isso dentro do método que vai devolver o callback:
//Buscando os campos
var inputs = $this.closest('.easy_form').find('.input_field');
inputs.each(function (a) {
//Pegando o nome do campo
var field = $(this).data('field');
//Verificando o tipo de campo para validação
var type = $(this).data('input-type');
/*Verificando a camada de interação que o input está relacionado
* OBservaçao: Os inputs podem estar dispostos em qualquer ordem no form.
*/
var layer = $(this).data('field-layer');
//Recebe o valor do input
var value = $(this).val();
//Concatena os dados usando o contador de input como base para dar a separação por '::' e por ',' corretamente.
if (n_fields < a) {
var concat = field + "::" + value + "::" + type + "::" + layer + ",";
} else {
var concat = field + "::" + value + "::" + type + "::" + layer;
}
//Faz p push na array
data.push(concat);
});
Se eu tento fazer como você disse:
var input = $(this);
Ele pega o método como $this, não o elemento que disparou o evento, aí ele não consegue achar onde estão os '.input_fields', ou talvez eu esteja fazendo algum coisa muito errada nessas trocas de informações.
Assim deu pra entender o problema ?
PS: do jeito que está funciona certinho, só to achando que esse não é o melhor modo de fazer isso D:O nome input, foi apenas um exemplo. Utilizar:
var input = $(this);
É o mesmo que:
var $this = $(this);
Só muda a nomenclatura. E, olhando pelo contexto, é difícil de entender que $this não é referente ao contexto em questão (igual a $(this) e sim a outro elemento). É uma questão de nomenclatura.
Alias, a convenção o correto ainda, deveria ser "$" + "elemento", por se tratar de um objeto jQuery.
Por exemplo, o nome da classe que você usa para realizar o bind do evento é ".elemento", ou seja
var $elemento = $(this);
No final, é apenas uma questão de nomenclatura.>
1 minuto atrás, Gabriel Heming disse:
O nome input, foi apenas um exemplo. Utilizar:
var input = $(this);
É o mesmo que:
var $this = $(this);
Só muda a nomenclatura. E, olhando pelo contexto, é difícil de entender que $this não é referente ao contexto em questão (igual a $(this) e sim a outro elemento). É uma questão de nomenclatura.
Alias, a convenção o correto ainda, deveria ser "$" + "elemento", por se tratar de um objeto jQuery.
Por exemplo, o nome da classe que você usa para realizar o bind do evento é ".elemento", ou seja
var $elemento = $(this);
No final, é apenas uma questão de nomenclatura.
Nossa eu panguei totalmente, estava atribuindo a variável input ao $(this) , e logo a baixo atribuía o val() a mesma variável sobrescrevendo ela, por isso que ele não encontrava!!
Só mudei onde estava (errado) :
>
Citar
var input = $inputs.closest('elemento) ~
para (deu certo):
>
Citar
var input_attrs = $inputs.closest('elemento) ~~
E mantive em cima:
>
Citar
var $inputs = $(this);
Problema resolvido!!
Brigadão!
Não é errado, está de acordo com o efeito de uma requisição assíncrona. Você pode ler mais aqui: https://stackoverflow.com/a/14220323/1628790
Entretanto, eu mudaria a chamada do método para apenas receber o callback:
metodo_da_requisicao(