Como saber se um navegador preencheu automaticamente uma caixa de texto? Especialmente com caixas de nome de usuário e senha que são preenchidas automaticamente em torno do carregamento da página.
Minha primeira pergunta é quando isso ocorre na sequência de carregamento da página? É antes ou depois do document.ready?
Em segundo lugar, como posso usar a lógica para descobrir se isso ocorreu? Não é que eu queira impedir que isso ocorra, basta conectar-se ao evento. De preferência algo como isto:
if (autoFilled == true) {
} else {
}
Se possível, eu adoraria ver um jsfiddle mostrando sua resposta.
Possíveis duplicatas
Evento DOM para preenchimento automático de senha do navegador?
Eventos acionados pelo preenchimento automático do navegador e Javascript
- Essas perguntas não explicam realmente quais eventos são acionados, mas apenas reaproximam continuamente a caixa de texto (não é bom para o desempenho!).
fonte
Respostas:
O problema é que o preenchimento automático é tratado de maneira diferente por diferentes navegadores. Alguns despacham o evento de mudança, outros não. Portanto, é quase impossível conectar-se a um evento que é acionado quando o navegador preenche automaticamente um campo de entrada.
Altere o acionador de eventos para diferentes navegadores:
Para campos de nome de usuário / senha:
Para outros campos de formulário:
As melhores opções são desabilitar o preenchimento automático de um formulário usando
autocomplete="off"
em seu formulário ou sondar em intervalos regulares para verificar se ele está preenchido.Para sua pergunta sobre se é preenchido no documento ou antes dele, novamente ele varia de navegador para navegador e de versão para versão. Para campos de nome de usuário / senha apenas quando você seleciona um campo de senha de nome de usuário é preenchido. Portanto, você teria um código muito confuso se tentar se conectar a qualquer evento.
Você pode ter uma boa leitura sobre isso AQUI
fonte
input
evento. É isso que o Chrome aciona no preenchimento automático (e provavelmente também no preenchimento automático, se o Chrome tiver isso; eu sempre desativo isso).Solução para navegadores WebKit
Nos documentos MDN da pseudo-classe CSS -webkit-autofill CSS:
Podemos definir uma regra css de transição nula no
<input>
elemento desejado , uma vez:-webkit-autofill
editado. JS será capaz de se conectar aoanimationstart
evento.Créditos à equipe da interface do usuário Klarna . Veja sua boa implementação aqui:
fonte
Isso funciona para mim nas versões mais recentes do Firefox, Chrome e Edge:
fonte
'input'
! Essa foi a solução mais fácil para mim, mas testei apenas para o preenchimento automático, não para o preenchimento automático.Para o preenchimento automático do google chrome, funcionou para mim:
fonte
Caso alguém esteja procurando uma solução (como eu estava hoje), para ouvir uma alteração de preenchimento automático do navegador, aqui está um método jquery personalizado que eu construí, apenas para simplificar o processo ao adicionar um ouvinte de alteração a uma entrada:
Você pode chamar assim:
fonte
Eu estava lendo muito sobre esse problema e queria fornecer uma solução muito rápida que me ajudou.
onde
inputBackgroundNormalState
para o meu modelo é 'rgb (255, 255, 255)'.Portanto, basicamente, quando os navegadores aplicam o preenchimento automático, eles tendem a indicar que a entrada é preenchida automaticamente aplicando uma cor amarela (irritante) diferente na entrada.
Editar: isso funciona para todos os navegadores
fonte
Infelizmente, a única maneira confiável que encontrei para verificar esse navegador cruzado é pesquisar a entrada. Para torná-lo responsivo, ouça também os eventos. O Chrome começou a ocultar valores de preenchimento automático do javascript, que precisa de um hack.
Adicione uma correção para os valores ocultos da senha do preenchimento automático do Chrome.
fonte
Há um novo componente polyfill para resolver esse problema no github. Dê uma olhada no evento de preenchimento automático . Basta instalar o bower e pronto, o preenchimento automático funciona conforme o esperado.
fonte
Minha solução:
Ouça os
change
eventos como faria normalmente e, no carregamento do conteúdo do DOM, faça o seguinte:Isso acionará os eventos de alteração para todos os campos que não estiverem vazios antes que o usuário tenha a chance de editá-los.
fonte
Também enfrentei o mesmo problema em que o rótulo não detectou o preenchimento automático e a animação ao mover o rótulo no preenchimento de texto estava sobreposta e essa solução funcionou para mim.
fonte
Eu estava procurando uma coisa semelhante. Somente Chrome ... No meu caso, a div do wrapper precisava saber se o campo de entrada foi preenchido automaticamente. Então, eu poderia fornecer CSS extra, assim como o Chrome faz no campo de entrada quando o preenche automaticamente. Ao analisar todas as respostas acima, minha solução combinada foi a seguinte:
O html para isso funcionar seria
fonte
Eu sei que esse é um tópico antigo, mas posso imaginar que muitos venham a encontrar uma solução para isso aqui.
Para fazer isso, você pode verificar se as entradas têm valores com:
Eu mesmo uso isso para verificar os valores no meu formulário de login quando ele é carregado para ativar o botão enviar. O código foi criado para o jQuery, mas é fácil de alterar, se necessário.
fonte
($("#inputID:-webkit-autofill").val().length > 0) {
Esta é a solução para navegadores com o mecanismo de renderização do webkit . Quando o formulário é preenchido automaticamente, as entradas receberão a pseudo classe : -webkit-autofill- (por exemplo, entrada: -webkit-autofill {...}). Portanto, esse é o identificador que você deve verificar via JavaScript.
Solução com alguma forma de teste:
E javascript:
O problema quando a página é carregada é obter o valor da senha, mesmo o tamanho. Isso ocorre porque a segurança do navegador. Também o tempo limite é porque o navegador preencherá o formulário após alguma sequência de tempo.
Este código adicionará a classe auto_filled às entradas preenchidas. Além disso, tentei verificar o valor ou o comprimento da senha do tipo de entrada, mas funcionou logo após a ocorrência de algum evento na página. Então, eu tentei desencadear algum evento, mas sem sucesso. Por enquanto, esta é a minha solução. Aproveitar!
fonte
Eu tenho a solução perfeita para esta pergunta, tente este trecho de código.
A demonstração está aqui
fonte
No chrome, você pode detectar campos de preenchimento automático definindo uma regra css especial para elementos preenchidos automaticamente e, em seguida, verificando com javascript se o elemento tem essa regra aplicada.
Exemplo:
CSS
Javascript
fonte
Aqui está a solução CSS retirada da equipe da Klarna UI. Veja sua boa implementação aqui, recurso
Funciona bem para mim.
fonte
Eu usei esta solução para o mesmo problema.
O código HTML deve mudar para este:
e o código jQuery devem estar em
document.ready
:fonte
Usei o evento de desfoque no nome de usuário para verificar se o campo pwd havia sido preenchido automaticamente.
Isso funciona para o IE e deve funcionar para todos os outros navegadores (verifiquei apenas o IE)
fonte
blur
event. I aplicar a mesma função para ochange
eblur
evento e funcionou muito bem. Uma solução simples sem bibliotecas extras.Eu tive o mesmo problema e escrevi esta solução.
Ele inicia a pesquisa em todos os campos de entrada quando a página está carregando (eu configurei 10 segundos, mas você pode ajustar esse valor).
Após 10 segundos, ele interrompe a pesquisa em todos os campos de entrada e começa a pesquisar apenas na entrada focada (se houver). Para quando você desfoca a entrada e inicia novamente se você focalizar uma.
Dessa forma, você pesquisa somente quando realmente necessário e apenas em uma entrada válida.
Não funciona muito bem quando você tem vários valores inseridos automaticamente, mas pode ser ajustado procurando todas as entradas no formulário atual.
Algo como:
fonte
Se você deseja detectar apenas se o preenchimento automático foi usado ou não, em vez de detectar exatamente quando e para qual campo o preenchimento automático foi usado, basta adicionar um elemento oculto que será preenchido automaticamente e verificar se isso contém qualquer valor. Entendo que talvez não seja isso o que muitas pessoas estão interessadas. Defina o campo de entrada com um tabIndex negativo e com coordenadas absolutas bem fora da tela. É importante que a entrada faça parte da mesma forma que o restante da entrada. Você deve usar um nome que será escolhido pelo preenchimento automático (por exemplo, "secondname").
Anexe esta entrada ao formulário e verifique seu valor no envio do formulário.
fonte
Há não parece ser uma solução para este que não depende de votação (pelo menos para o Chrome). É quase tão idiota, mas acho que é marginalmente melhor que a pesquisa global.
Considere o seguinte cenário:
O usuário começa a preencher o campo1
O usuário seleciona uma sugestão de preenchimento automático que preenche automaticamente os campos 2 e 3
Solução: registre um onblur em todos os campos que verifique a presença de campos preenchidos automaticamente por meio do seguinte snippet do jQuery $ (': - webkit-autofill')
Isso não será imediato, pois será adiado até que o usuário desfoque o campo1, mas não depende da pesquisa global, portanto, o IMO é uma solução melhor.
Dito isto, como pressionar a tecla Enter pode enviar um formulário, você também pode precisar de um manipulador correspondente para onkeypress.
Como alternativa, você pode usar a pesquisa global para verificar $ (': - webkit-autofill')
fonte
Pela minha experiência pessoal, o código abaixo funciona bem com o firefox IE e o safari, mas não está funcionando muito bem ao escolher o preenchimento automático no chrome.
O código abaixo funciona melhor, porque será acionado sempre que o usuário clicar no campo de entrada e, a partir daí, você poderá verificar se o campo de entrada está vazio ou não.
fonte
Eu consegui no chrome com:
fonte
Minha solução é:
fonte
Após a pesquisa, o problema é que os navegadores da Webkit não acionam evento de alteração no preenchimento automático. Minha solução foi obter a classe de preenchimento automático que o webkit adiciona e acionar o evento de alteração sozinho.
Aqui está um link para o problema no cromo. https://bugs.chromium.org/p/chromium/issues/detail?id=636425
fonte
Para detectar e-mail, por exemplo, tentei "em mudança" e um observador de mutações, nem funcionou. O setInterval funciona bem com o preenchimento automático do LinkedIn (não revelando todo o meu código, mas você entendeu a idéia) e funciona bem com o back-end se você adicionar condições extras aqui para desacelerar o AJAX. E se não houver alterações no campo do formulário, como se não estivessem digitando para editar seus emails, o lastEmail evitará pings inúteis do AJAX.
fonte
Eu tive dificuldade em detectar o preenchimento automático no Firefox. Esta é a única solução que funcionou para mim:
Demo
HTML:
CSS:
JavaScript:
Para o Chrome, eu uso:
if ($(this).css('animation-name') == 'onAutoFillStart')
Para o Firefox:
if ($(this).val() != '')
fonte
tente em CSS
input:-webkit-autofill { border-color: #9B9FC4 !important; }
fonte