Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

JavaScript $(this)

campo.one("focus", function(){
    var id = setInterval(function(){
       tempoDigitacao--;
        $("#tempo-digitacao").text(tempoDigitacao);

        if(tempoDigitacao < 1){
            $(this).attr("disabled", true); <-- não funciona o this
                clearInterval(id);
        }
    }, 1000);
});

Minha pergunta provavelmente será a resposta talvez, mas, como eu não gosto de ter dúvidas é sempre bom perguntar.

O this sempre é utilizado para referênciar o elemento em questão certo?

Neste caso ele não está funcionando pois o elemento em questão não é mais o campo, e sim o id ou o setInterval não sei ao certo, eu sei que no console ele referência window.

Alguém poderia me dar uma explicação sobre?

2 respostas
solução!

Oi Nicolas, tudo bom?

Isso ocorre por uma questão de escopo. O escopo dentro de

    var id = setInterval(function(){
     ...
});

é diferente do escopo de:

campo.one("focus", function(){
    ...
});

Ou seja, no nosso código temos 2 escopos e cada escopo tem seu this:

campo.one("focus", function(){
    // aqui o this é campo
    var id = setInterval(function(){
    // aqui temos outro escopo, outro this.
       tempoDigitacao--;
        $("#tempo-digitacao").text(tempoDigitacao);

        if(tempoDigitacao < 1){
            $(this).attr("disabled", true); <-- não funciona o this
                clearInterval(id);
        }
    }, 1000);
});

Para contornar essa questão de escopo é comum separarmos o escopo externo em uma variavel. Algo como:

campo.one("focus", function(){
        var thisCampo = $(this);
    var id = setInterval(function(){

    tempoDigitacao--;
        $("#tempo-digitacao").text(tempoDigitacao);

        if(tempoDigitacao < 1){
            thisCampo.attr("disabled", true); // contornamos o escopo
                clearInterval(id);
        }
    }, 1000);
});

Assim, guardamos o "this do campo" em uma variavel e acessamos ela em outro escopo, evitando o conflito =)

Qualquer problema é só falar.

Abraço e bons estudos

Valeu =)