2012-01-09 30 views
98

tengo la siguiente función:jQuery obtener valor de entrada después de pulsación de tecla

$(document).ready(function() { 
    $("#dSuggest").keypress(function() { 
     var dInput = $('input:text[name=dSuggest]').val(); 
     console.log(dInput); 
     $(".dDimension:contains('" + dInput + "')").css("display","block"); 
    }); 
}); 

Por alguna razón, por primera pulsación de tecla, me estoy poniendo una cadena vacía para el registro de la consola.

Respuesta

122

Esto se debe a keypress eventos se activan antes se añade el nuevo carácter a la value del elemento (por lo que la primera keypress evento se dispara antes de añadir el primer carácter, mientras que la value sigue vacío). Debería usar keyup en su lugar, que se dispara después de se ha agregado el carácter.

Tenga en cuenta que, si su elemento #dSuggest es la misma que input:text[name=dSuggest] puede simplificar considerablemente el código (y si no lo es, que tiene un elemento con un nombre que es el mismo que el id de otro elemento no es una buena idea).

$('#dSuggest').keypress(function() { 
    var dInput = this.value; 
    console.log(dInput); 
    $(".dDimension:contains('" + dInput + "')").css("display","block"); 
}); 
+2

Works, pero con jQuery 2.x cabo esto está fuera de fecha ahora como la respuesta más abajo utilizando el encendido y la entrada es la mejor manera de hacerlo ahora. – ppumkin

+1

@ppumkin: El hecho de que jQuery 2 no esté disponible no significa que las personas no necesiten ser compatibles con IE8 y versiones anteriores. Y no veo nada en los documentos que sugiera soporte real para el tipo de evento 'input'. –

+6

Corrija, deben dejar de soportar IE, señale. La mayoría de las "soluciones temporales" en jQuery 1.x son para IE, por lo que realmente se debe renombrar a jQuerIE. – ppumkin

28

Use .keyup en lugar de la tecla.

También use $(this).val() o simplemente this.value para acceder al valor de entrada actual.

DEMO aquí

información acerca de los documentos del .keypress jQuery,

El evento de pulsación de tecla se envía a un elemento cuando el navegador registra entrada de teclado. Esto es similar al evento keydown, excepto en el caso de repeticiones de teclas . Si el usuario presiona y mantiene presionada una tecla, se activa una vez el evento con una tecla de tecla, pero se activan eventos de tecla por separado para cada carácter insertado. Además, las teclas modificadoras (como Shift) desencadenan eventos de tecla pero no eventos de pulsación de tecla.

+3

'keyup' es demasiado lento, y una tecla puede ser presionada y retenida sin ser liberada y las cosas deben suceder. es mejor usar 'keydown' con un poco de tiempo de espera para que el valor realmente cambie. – vsync

+0

el único inconveniente que he encontrado es que si el usuario presionó más de un carácter de teclado juntos, no se registrará correctamente. – vsync

5

Tiene que interrumpir el hilo de ejecución para permitir que la entrada se actualice.

$(document).ready(function(event) { 
     $("#dSuggest").keypress(function() { 
      //Interrupt the execution thread to allow input to update 
       setTimeout(function() { 
        var dInput = $('input:text[name=dSuggest]').val(); 
        console.log(dInput); 
        $(".dDimension:contains('" + dInput + "')").css("display","block"); 
       }, 0); 
     }); 
    }); 
+0

Funciona ... pero la clave es el evento apropiado para usar – ppumkin

+1

El retraso de 'keyup' es demasiado lento para algunos fines, y tampoco filtra automáticamente las teclas modificadoras. Esto realmente funciona mejor para mí. –

+0

mejor respuesta. keyup: lento y no puede capturar caracteres como @ con dos teclas presionadas. –

150

darse cuenta de que este es un post bastante antiguo, voy a proporcionar una respuesta de todas formas, yo estaba luchando con el mismo problema.

En su lugar, debe utilizar el evento "input" y registrarse con el método .on. Esto es rápido, sin el retraso de keyup y resuelve el problema de tecla que falta más reciente que usted describe.

$('#dSuggest').on("input", function() { 
    var dInput = this.value; 
    console.log(dInput); 
    $(".dDimension:contains('" + dInput + "')").css("display","block"); 
}); 

Demo here

+23

Esto debe marcarse como una respuesta correcta: keyup quizás resuelve el problema de carácter faltante, pero es problemático determinar si el carácter fue realmente escrito (y la clave no era, por ejemplo, "tab" o "home"). +1 para usted – Nashi

+2

Usted señor, es un genio –

+0

La mejor respuesta, debería estar en la parte superior. – Jacob

3

Esto se debe a Keypress evento se dispara antes de añadir el nuevo carácter. Use el evento 'keyup' en su lugar, que funcionará perfectamente en su situación.

$(document).ready(function() { 
    $("#dSuggest").keyup(function() { 
     var dInput = $('input:text[name=dSuggest]').val(); 
     console.log(dInput); 
     $(".dDimension:contains('" + dInput + "')").css("display","block"); 
    }); 
}); 

quiero añadir a esto, si tiene muchos cuadros de texto y usted tiene que hacer lo mismo en su caso keyup simplemente les puede dar una clase css común (por ejemplo commoncss) y aplicar keyup evento como este .

$(document).ready(function() { 
    $(".commoncss").keyup(function() { 
     //your code 
    }); 
}); 

Esto reducirá en gran medida el código, ya que no tiene que aplicar el evento de tecla por ID para cada cuadro de texto.

0

Creo que lo que necesita es el siguiente prototipo

$(element).on('input',function(){code}) 
0

que estaba buscando un ejemplo ES6 (por lo que podría pasar a mi linter) Así que para otras personas que están en busca de la misma:

$('#dSuggest').keyup((e) => { 
    console.log(e.currentTarget.value); 
}); 

también me gustaría usar keyup debido a que obtiene el valor actual que se llena.

Cuestiones relacionadas