Bug com Firefox - Atributo de entrada desabilitado que não é reiniciado ao atualizar

103

Eu descobri o que acredito ser um bug no Firefox e estou me perguntando se isso realmente é um bug, bem como alguma solução alternativa para isso.

Se você criar uma página da web básica com a seguinte fonte:

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
  </head>
  <body>
    <div>
      <input id="txtTest" type="text" />
      <input type="button" onclick="$('#txtTest').attr('disabled','disabled');" value="Set Disabled (jQuery)" />
      <input type="button" onclick="document.getElementById('txtTest').disabled = true;" value="Set Disabled (js)" />
      <input type="button" onclick="$('#txtTest').removeAttr('disabled');" value="Remove Disabled" />
    </div>
  </body>
</html>

Se você disableo fizer textboxdinamicamente e depois atualizar a página, o textboxpermanecerá desabilitado em vez de voltar ao seu estado original de desabilitado. Eu tentei isso no IE8 e no Chrome e eles se comportam como eu esperava, redefinindo a textboxparte traseira para não desabilitada quando eu atualizo.

Outra informação interessante é que ainda faz a mesma coisa se a entrada for um em checkboxvez de a textbox.

Stephen Mesa
fonte
2
Tem certeza de que não é apenas o "recurso" do Firefox que lembra o estado dos inputelementos quando você simplesmente atualiza?
thirtydot
@thirtydot: Eu também estava pensando sobre isso, então também tentei fazer experiências com a configuração dinâmica do atributo "size", e isso é redefinido na atualização, assim como todos os outros navegadores. Portanto, parece que o que descobri até agora é que o Firefox manterá o atributo desativado, bem como o valor real da entrada, mas não o tamanho ...
Stephen Mesa
5
Uau, você está certo! Defino autocomplete = "off" na entrada e isso não acontece mais. É muito inconveniente que o firefox o habilite por padrão!
Stephen Mesa
3
Sim, esqueci que você pode desativá-lo com autocomplete="off". Esta postagem do blog me parece familiar, então definitivamente já me deparei com isso antes. Você deve escrever uma resposta para sua própria pergunta (ou devo?)
thirtydot
1
Há um relatório de bug aberto do Mozilla sobre isso: bugzilla.mozilla.org/show_bug.cgi?id=654072
cvrebert

Respostas:

126

Este é um "recurso" do Firefox que lembra os valores de entrada do formulário nas atualizações da página. Para corrigir esse comportamento, basta definir autocomplete="off"no formulário que contém as entradas, ou apenas diretamente na entrada.

Isso impede que o preenchimento automático funcione e evita que o navegador se lembre do estado dos campos de entrada.

Como alternativa, você pode apenas "atualizar" clicando em CTRL + F5. Isso redefinirá completamente a página atual.

Stephen Mesa
fonte
4
Acabei de encontrar esse problema quando o usuário clica no botão Voltar, parece autocomplete="off"que não funciona nesse caso.
solarc
1
não quero um formulário, só tenho um único botão e o Firefox "lembra" que está desabilitado ... irritante. Posso redefini-lo via JS, mas ... mal.
vsync
@vsync Tente configurá-lo no elemento botão / entrada. Deve funcionar também!
Henrik Heimbuerger
4
Você ainda tem que fazer isso nos botões. Acho difícil acreditar que este é um recurso e não um bug?
Liam
1
isso também afeta as entradas ocultas
Liam,
10

Para lidar com o botão Voltar, faça isso (a partir daqui )

    window.addEventListener('pageshow', PageShowHandler, false);
    window.addEventListener('unload', UnloadHandler, false);

    function PageShowHandler() {
        window.addEventListener('unload', UnloadHandler, false);
    }

    function UnloadHandler() {
        //enable button here
        window.removeEventListener('unload', UnloadHandler, false);
    }
Joshua Fox
fonte
Não sei por que essa resposta tem apenas um voto favorável, enquanto a outra resposta tem 99. Restaurar o estado desabilitado ao descarregar é melhor do que desabilitar o autocomplete, já que o autocomplete é uma funcionalidade desejável.
Nick
Acho que //enable button hereé redundante aqui; Minha compreensão dos documentos referidos é que simplesmente a presença do ouvinte de eventos impedirá que a página seja armazenada no BFcache.
myf
Observe que adicionar um gerenciador de descarregamento tem outros efeitos colaterais no Firefox: developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/1.5/…
robocat
2

Como mencionado antes, você precisa adicionar autocomplete="off"aos seus botões.

Aqui está um sh+ perlsnippet para automatizar isso no caso de <button>s em seus arquivos / modelos HTML (sob algumas suposições):

find /path/to/html/templates -type f -name '*.html' -exec perl -pi -e \
  's/(?<=<button )(.*?)(?=>)/@{[(index($1,"autocomplete=")!=-1?"$1":"$1 autocomplete=\"off\"")]}/g' \
  {} +

As premissas são:

  • As <button>tags de abertura começam e terminam na mesma linha. Se este não for o caso (ou seja, eles podem ser divididos em várias linhas), a substituição /gpor /gsdeve ajudar (o smodificador faz .com que as novas linhas também correspondam)

  • HTML válido (por exemplo, não há caracteres engraçados entre <e >) e nenhum maior que ( >) sem escape dentro da tag de abertura.

phk
fonte
0

Este é realmente um bug aberto no Firefox. Também há uma observação no MDN:autocomplete (role para baixo até a segunda caixa amarela):

Nota: O autocompleteatributo também controla se o Firefox irá - ao contrário de outros navegadores - persistir o estado de desativação dinâmica e (se aplicável) a verificação dinâmica de um <input>elemento, <textarea>elemento ou todo o <form>carregamento de página. O recurso de persistência é habilitado por padrão. Definir o valor do autocompleteatributo paraoff desabilitar este recurso. Isso funciona mesmo quando o atributo autocomplete normalmente não se aplica em virtude de seu tipo. Veja bug 654072 .

Se você estiver usando o Bootstrap, pode estar interessado no

str
fonte