2012-08-26 12 views
5

Me gustaría iniciar una acción (habilitando autocompletar) cuando el usuario escribe '@'. Sin embargo, no sé cómo hacerlo correctamente. Tengo jQuery disponible.Detectar el carácter ingresado con JavaScript

Por lo general, en un teclado QWERTY, que es la siguiente:

$('textarea').live('keydown', function(e) { 
    if (e.which === 50) { 
    console.log('@ has been entered.'); 
    } 
}); 

Sin embargo, no funciona correctamente en un teclado AZERTY. El código clave = 50 corresponde a la clave é~/2. Para escribir '@' en el teclado AZERTY, es la tecla AltGr + à@/0.

Editar: No estaba claro. Autocompletar comienza cuando se ingresa @, y solo después de eso. Por ejemplo, cuando alguien ingresa "Hello @" comienza, sin embargo, cuando escribe "Hello @nothing else", el mensaje completo no hará nada. Ejemplo: http://mrkipling.github.com/jQuery-at-username/ (funciona solo en el teclado QWERTY).

+0

D'oh, yo no darse cuenta de lo StackOverlow tiene exactamente lo que necesito con la función de autocompletar nombre de usuario en el comentario. – jcisio

Respuesta

3

Uso keypress en lugar de keydown. Mientras keydown se relaciona con cada pulsación de una tecla, keypress se relaciona con los caracteres traducidos, por ejemplo a puede ser diferente a a mientras se presiona la tecla Mayús, los caracteres compuestos funcionan, funcionan las teclas muertas y se manejan otras diferencias en las asignaciones del teclado .

+0

¡Exactamente! El evento 'keypress' detecta correctamente el código de' @ '(64). Creo que tendré que separar los dos eventos: uno para detectar el carácter '@', otro usando 'keydown' para detectar las teclas de flecha para la parte" completa ". – jcisio

+0

He hecho esa combinación en autocompletas. –

+0

@jcisio Eso tiene sentido. Sin embargo, no estoy seguro del soporte de navegador unificado de 'keypress'. – VisioN

0

La única otra opción que se le viene a la mente sería un temporizador que verifica el contenido de la entrada de texto.

var patt=new RegExp(/^@/); 
var charCheck = setInterval(function(){ 
    if (patt.test($("#textInput").val())){ 
    // initiate autocomplete 
    } 
},100); 

Este código inspeccionará el contenido del elemento #textInput y ver si coincide con la expresión regular de un símbolo @ en el principio de la cadena. Si lo hace, la función test() se evaluará como verdadera y podrá iniciar su código de autocompletar.

+0

Debe verificar @ en cualquier lugar en el área de texto, y la autocompleta solo comienza cuando el cursor está justo después del carácter '@'. Creo que aún es posible verificar todas estas condiciones, pero ¿hay alguna solución más simple? – jcisio

+0

@jci - Debe mencionar la especificación sobre la posición del cursor en su publicación principal. Además, si desea buscar ese símbolo en cualquier lugar de la cadena, simplemente elimine el símbolo '^'. – Lix

2

¿Qué tal si se ingresara @ como el último carácter en el valor del campo?

$("body").on("keyup", "textarea", function(e) { 
    if (this.value.indexOf("@") == this.value.length - 1) { 
     console.log("Starting autocomplete"); 
    } 
});​ 

DEMO:http://jsfiddle.net/FKhPW/2/

+0

Gracias, básicamente hace lo que me gustaría hacer. Hay algunos casos, por ejemplo, cuando el usuario finaliza un mensaje, luego se mueve al principio y agrega '@nombre de usuario', no funcionará. Intentaré adaptarlo. – jcisio

+0

no funciona. su disparo, incluso para la tecla Atrás y la tecla de mayúsculas – Ashirvad

+0

@jcisio Sí, es posible que necesite alguna corrección. Al menos no veo ninguna otra solución rápida y funcional. – VisioN

0

Aquí tiene demostración de trabajo:http://jsfiddle.net/LxpQQ/

de mi viejo respuesta aquí:

jquery autocomplete using '@'

espero que se ajuste a usted causa :)

código

source: function(request, response) { 
      if (request.term.indexOf("@") >= 0) { 
       $("#loading").show(); 
       getTags(extractLast(request.term), function(data) { 
        response($.map(data.tags, function(el) { 
         return { 
          value: el.name, 
          count: el.count 
         } 
        })); 
        $("#loading").hide();      
       }); 
      } 
     }, 
+0

Gracias, aunque estoy evitando jQuery UI (y su biblioteca de autocompletar), este ejemplo tiene algunos puntos inteligentes, como que solo obtiene el último término, etc. Estoy marcando para usarlo más adelante. – jcisio

+0

@jcisio Cooleos ':)' –

0

Utilice event.key y JS moderno, buscando @ directamente!

No hay códigos de número más. Puede verificar la clave directamente.

const input = document.getElementById("textarea"); 
input.addEventListener("keydown", function (event) { 
    if (event.key === "@") { 
     // Do something 
    } 
}); 

Mozilla Docs

Supported Browsers

Cuestiones relacionadas