Detección de JavaScript del contexto de pulsación de tecla (selección del historial del formulario vs. envío del formulario)

StackOverflow https://stackoverflow.com/questions/416220

Pregunta

Estoy escribiendo un complemento de formulario semi-genérico utilizando jQuery para acelerar el desarrollo del proyecto en el que estoy trabajando.

El plan es que una plantilla jTemplates contenga los campos, mi complemento revisa la plantilla para encontrar cualquier los recursos multilingües requeridos, los solicita al servidor y luego los empaqueta en un objeto JavaScript que luego se pasa a una función personalizada en " enviar " ;.

Todo funciona bien, excepto el estándar "cuando se presiona Enter, envíe el formulario" Código que debes hacer cuando estás falsificando un formulario:

opts.coreElement.find('input[type=text]').keypress(function(evt) {
    if ((evt.keyCode || evt.which) == 13) {
        opts.coreElement.find('.saveButton').click();
    }
});

El problema es que en Firefox (al menos; aún no he revisado otros navegadores), si ingresó información en un cuadro de texto con el mismo nombre anteriormente, obtiene el historial de formularios. Si luego selecciona uno de esos valores sugeridos presionando Intro, envía el formulario. No es genial si estás en la primera entrada de la página. Realmente bastante molesto, en realidad.

La solución obvia parece ser insertar un elemento de formulario alrededor de los campos y detener cualquier posible envío de este formulario ficticio a través de jQuery. Afortunadamente tengo el lujo de hacer esto, ya que estoy en ASP.NET MVC, pero ¿y si no fuera así? ¿Qué pasa si mi complemento no sabía si ya estaba dentro de un formulario y, por lo tanto, tenía que mantenerse solo? ¿Qué pasaría si estuviera en WebForms ASP.NET estándar y tuviera un objetivo manual de "destino"? ¿La tecla de retorno de cada entrada al botón de envío correcto?

¿Hay alguna forma, tal vez a través del objeto del evento en sí, para detectar el contexto de la pulsación de tecla, para que pueda filtrar la selección de elementos del historial de formularios?

¿Fue útil?

Solución

Establezca el atributo autocompletar en sus campos de texto en off :

opts.coreElement.find('input[type=text]').each(function() {
     $(this).attr('autocomplete', 'off');
});

Esto funciona para todos los principales navegadores (Safari, Firefox, IE).

Otros consejos

He descubierto que para evitar la acción predeterminada para un evento clave [enter] o [tab], debe escuchar el evento keydown y manejarlo / cancelarlo.
En el momento en que se activa Keyup o Keypress, el valor predeterminado para Keydown ya ha ocurrido.

La respuesta de wulong funciona pero no respondió completamente la pregunta. La solución propuesta es deshabilitar el historial del campo de texto de entrada. Pero, ¿hay alguna forma de saber si el evento pulsado por tecla proviene del texto de entrada o del historial?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top