Detecção de JavaScript do contexto KeyPress (seleção de histórico de formulários vs. envio do formulário)

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

Pergunta

Estou escrevendo um plug-in de formulário semi-genérico usando o jQuery para acelerar o desenvolvimento do projeto em que estou trabalhando.

O plano é que um JTemplates O modelo contém os campos, meu plug-in olha através do modelo para encontrar quaisquer recursos multilíngues necessários, solicita-os do servidor e, em seguida, empacota tudo em um objeto JavaScript que é passado para uma função personalizada em "Enviar".

Tudo está funcionando bem, exceto o padrão "Quando Enter é pressionado, envie o formulário" que você precisa fazer quando estiver fingindo um formulário:

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

A questão é que, no Firefox (pelo menos; ainda não verifiquei outros navegadores), se você inseriu informações em uma caixa de texto com nome semelhante antes, obtém seu histórico de formulários. Se você selecionar um desses valores sugeridos pressionando Enter, ele enviará o formulário. Não é ótimo se você estiver na primeira entrada na página. Realmente bastante irritante, na verdade.

A solução óbvia parece ser inserir um elemento de formulário em torno dos campos e interromper qualquer possível envio deste formulário fictício via jQuery. Felizmente, tenho o luxo de fazer isso, pois estou no ASP.NET MVC, mas e se eu não fosse? E se meu plugin não soubesse se já estava dentro de um formulário e, portanto, tivesse que se manter? E se eu estivesse no Webforms padrão ASP.NET e eu teve Para "direcionar" manualmente a tecla de retorno de cada entrada para o botão de envio correto?

Existe uma maneira, talvez através do próprio objeto de evento, para detectar o contexto do KeyPress, para que eu possa filtrar a seleção de itens de histórico de formulários?

Foi útil?

Solução

Colocou o autocomplete atribuir em seus campos de texto a off:

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

Isso funciona para todos os principais navegadores (Safari, Firefox, ou seja).

Outras dicas

Descobri que, para impedir a ação padrão para um evento de chave [Enter] ou [tab], você deve ouvir o evento KeyDown e manipular/cancelar.
Quando KeyUp ou KeyPress é acionado, o padrão para KeyDown já aconteceu.

A resposta de Wulong funciona, mas não respondeu completamente à pergunta. A solução proposta é desativar o histórico do campo de texto de entrada. Mas existe uma maneira de saber se o evento KeyPpressado vem do texto de entrada ou da história?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top