No IE, eu posso fazer isso com o jQuery (terrivelmente fora do padrão, mas funcionando)
if ($.browser.msie)
$(document).keydown(function(e) { if (e.keyCode == 8) window.event.keyCode = 0;});
Mas é possível fazer de uma maneira que funcione no Firefox ou de um modo cruzado para obter um bônus?
Para o registro:
$(document).keydown(function(e) { if (e.keyCode == 8) e.stopPropagation(); });
faz nada.
$(document).keydown(function(e) { if (e.keyCode == 8) e.preventDefault(); });
resolve o problema, mas torna a chave de backspace inutilizável na página, o que é ainda pior que o comportamento original.
EDIT: A razão pela qual faço isso é que não estou criando uma página da Web simples, mas um aplicativo grande. É incrivelmente chato perder 10 minutos de trabalho só porque você pressionou o backspace no lugar errado. A proporção entre evitar erros e usuários irritantes deve estar muito acima de 1000/1, impedindo que a tecla backspace navegue de volta.
EDIT2: Eu estou não tentar impedir a navegação história, apenas acidentes.
EDIT3: comentário @brentonstrines (movido para cá porque a pergunta é muito popular): Esta é uma 'correção' de longo prazo, mas você pode apoiar seu bug do Chromium para alterar esse comportamento no webkit
fonte
Respostas:
Esse código resolve o problema, pelo menos no IE e no Firefox (não testei nenhum outro, mas eu lhe dou uma chance razoável de funcionar se o problema existir em outros navegadores).
fonte
d.type.toUpperCase() === 'PASSWORD'
também. Caso contrário, parece bomif( $(d).is( ":input" ) )...
d.isContentEditable
aqui.Esse código funciona em todos os navegadores e engole a tecla backspace quando não estiver em um elemento do formulário ou se o elemento do formulário estiver desativado | readOnly. Também é eficiente, o que é importante quando está sendo executado em todas as chaves digitadas.
fonte
if(!rx.test(e.target.tagName) || $(e.target).is(':checkbox') || $(e.target).is(':radio') || $(e.target).is(':submit') || e.target.disabled || e.target.readOnly )
contentEditable
..is(':checkbox,:radio,:submit')
As outras respostas aqui estabeleceram que isso não pode ser feito sem os elementos da lista de permissões nos quais o Backspace é permitido. Essa solução não é ideal porque a lista de permissões não é tão direta quanto meramente as áreas de texto e as entradas de texto / senha, mas é repetidamente considerada incompleta e precisando ser atualizada.
No entanto, como o objetivo de suprimir a funcionalidade de backspace é meramente impedir que os usuários percam dados acidentalmente, a solução beforeunload é boa porque o pop-up modal é surpreendente - os pop-ups modais são ruins quando acionados como parte de um fluxo de trabalho padrão, porque o usuário se acostuma a dispensá-los sem lê-los, e eles são irritantes. Nesse caso, o pop-up modal apareceria apenas como uma alternativa a uma ação rara e surpreendente e, portanto, é aceitável.
O problema é que um modal onbeforeunload não deve aparecer sempre que o usuário navega para fora da página (como ao clicar em um link ou ao enviar um formulário), e não queremos iniciar a lista de permissões ou a lista negra de condições específicas antes da carga.
A combinação ideal de vantagens e desvantagens para uma solução generalizada é a seguinte: acompanhe se o backspace está pressionado e, somente se necessário, apareça o modal onbeforeunload. Em outras palavras:
Isso foi testado para funcionar no IE7 +, FireFox, Chrome, Safari e Opera. Basta soltar essa função no seu global.js e chamá-la de qualquer página em que você não queira que os usuários percam acidentalmente seus dados.
Observe que um modal onbeforeunload pode ser acionado apenas uma vez; portanto, se o usuário pressionar backspace novamente, o modal não será acionado novamente.
Observe que isso não será acionado em eventos de alteração de hash, no entanto, nesse contexto, você pode usar outras técnicas para impedir que os usuários percam acidentalmente seus dados.
fonte
Uma solução mais elegante / concisa:
fonte
Modificação da resposta de erikkallen para abordar diferentes tipos de entrada
Descobri que um usuário empreendedor pode pressionar backspace em uma caixa de seleção ou em um botão de opção em uma tentativa vã de limpá-lo. Em vez disso, eles navegariam para trás e perderiam todos os dados.
Essa alteração deve resolver esse problema.
Nova edição para tratar de divs editáveis de conteúdo
Exemplo
Para testar faça 2 arquivos.
starthere.htm - abra isso primeiro para ter um lugar para voltar
test.htm - Irá retroceder quando o backspace for pressionado enquanto a caixa de seleção ou o envio estiver focado (alcançado por tabulação). Substitua pelo meu código para corrigir.
fonte
Com base nos comentários, parece que você deseja impedir que as pessoas percam informações em formulários, se elas pressionarem backspace para excluir, mas o campo não estiver focado.
Nesse caso, você deseja examinar o manipulador de eventos onunload . O Stack Overflow o usa - se você tentar sair de uma página quando começar a escrever uma resposta, será exibido um aviso.
fonte
Pare de navegar neste código funciona!
Mas para não restringir os campos de texto, mas outros
Para evitá-lo para um campo específico, basta usar
Referindo-se a este abaixo!
Impedir que o BACKSPACE navegue de volta com o jQuery (como a página inicial do Google)
fonte
A maioria das respostas está em jquery. Você pode fazer isso perfeitamente em Javascript puro, simples e sem necessidade de biblioteca. Este artigo foi um bom ponto de partida para mim, mas como keyIdentifier está obsoleto, eu queria que esse código fosse mais seguro, então adicionei || e.keyCode == 8 à instrução if. Além disso, o código não estava funcionando bem no Firefox, então adicionei return false; e agora funciona perfeitamente bem. Aqui está:
Esse código funciona muito bem porque,
fonte
Combinando soluções fornecidas por "thetoolman" e& "Biff MaGriff"
O código a seguir parece funcionar corretamente no IE 8 / Mozilla / Chrome
fonte
Não sei por que ninguém acabou de responder a isso - parece uma pergunta técnica perfeitamente razoável para perguntar se é possível.
Não, não acho que exista uma maneira entre navegadores de desativar o botão backspace. Sei que não está habilitado por padrão no FF atualmente.
fonte
Foi difícil encontrar uma resposta que não fosse JQUERY. Agradeço a Stas por me colocar na pista.
Chrome: se você não precisar de suporte entre navegadores, basta usar uma lista negra, em vez da lista de permissões. Esta versão JS pura funciona no Chrome, mas não no IE. Não tenho certeza sobre FF.
No Chrome (versão 36, meados de 2014), os pressionamentos de tecla que não estão em um elemento de entrada ou conteúdo editável parecem ser direcionados
<BODY>
. Isso possibilita o uso de uma lista negra, que eu prefiro na lista de permissões. O IE usa o destino do último clique - portanto, pode ser um div ou qualquer outra coisa. Isso torna isso inútil no IE.Navegador Cruzado: para javascript puro, achei a resposta da Stas a melhor. A adição de mais uma verificação de condição para contenteditable fez com que funcionasse para mim *:
* Observe que os IEs [edit: e Spartan / TechPreview] têm um "recurso" que torna os elementos relacionados à tabela não editáveis . Se você clicar em um deles e, em seguida, pressionar backspace, ele voltará. Se você não possui
<td>
s editáveis , isso não é problema.fonte
Essa solução é semelhante a outras postadas, mas usa uma lista de desbloqueio simples, tornando-a facilmente personalizável para permitir o backspace em elementos especificados, basta definir o seletor na função .is ().
Eu o uso neste formulário para impedir que o backspace nas páginas navegue de volta:
fonte
Para elaborar um pouco a excelente resposta de @ erikkallen , aqui está uma função que permite todos os tipos de entrada baseados em teclado, incluindo os introduzidos no HTML5 :
fonte
Maneira do jQuery do JavaScript -:
Javascript - a maneira nativa, que funciona para mim:
fonte
Eu tive alguns problemas com a solução aceita e o plug-in Select2.js; Não pude excluir caracteres na caixa editável porque a ação de exclusão estava sendo impedida. Esta foi a minha solução:
O Select2 cria um Span com um atributo "contentEditable", definido como true para a caixa de combinação editável. Eu adicionei o código para levar em conta o spanName tagName e o atributo diferente. Isso resolveu todos os meus problemas.
Edit: Se você não estiver usando o plug-in de caixa de combinação Select2 para jquery, essa solução poderá não ser necessária e a solução aceita poderá ser melhor.
fonte
fonte
Este código resolve o problema em todos os navegadores:
fonte
DIV
ouTD
.Maneira mais simples de impedir a navegação ao pressionar backspace
fonte
Usando o Dojo toolkit 1.7, isso funciona no IE 8:
fonte
Você já tentou a solução muito simples de adicionar o seguinte atributo ao seu campo de texto somente leitura:
onkeydown = "return false;"
Isso impedirá que o navegador volte no histórico quando a tecla Backspace for pressionada em um campo de texto somente leitura. Talvez eu esteja perdendo sua verdadeira intenção, mas parece que essa seria a solução mais simples para o seu problema.
fonte
Uma solução muito mais limpa -
Como alternativa, você só pode verificar se
fonte
Versão javascript pura, que funciona em todos os navegadores:
Claro que você pode usar "INPUT, TEXTAREA" e usar "if (! Regex.test (elements))" então. O primeiro funcionou bem para mim.
fonte
Atuação?
Eu estava preocupado com o desempenho e criei um violino: http://jsfiddle.net/felvhage/k2rT6/9/embedded/result/
Analisei os métodos mais promissores que encontrei neste tópico. Acontece que todos eles foram muito rápidos e provavelmente não causam problemas em termos de "lentidão" ao digitar. O método mais lento que eu observei foi de cerca de 125 ms para 10.000 chamadas no IE8. Qual é 0,0125ms por curso.
Eu achei os métodos postados por Codenepal e Robin Maben os mais rápidos ~ 0.001ms (IE8), mas cuidado com as semânticas diferentes.
Talvez isso seja um alívio para alguém que introduz esse tipo de funcionalidade em seu código.
fonte
Resposta erikkallen modificada:
fonte
Esta solução funcionou muito bem quando testada.
Eu adicionei algum código para lidar com alguns campos de entrada não marcados com entrada e para integrar um aplicativo Oracle PL / SQL que gera um formulário de entrada para o meu trabalho.
Meus dois centavos":
fonte
Criei um projeto NPM com uma versão limpa do atualmente aceito (de erikkallen)
https://github.com/slorber/backspace-disabler
Ele usa basicamente os mesmos princípios, mas:
fonte
Aqui está minha reescrita da resposta mais votada. Tentei verificar element.value! == indefinido (já que alguns elementos como podem não ter atributo html, mas podem ter uma propriedade de valor javascript em algum lugar da cadeia de protótipos), no entanto, isso não funcionou muito bem e teve muitos casos de borda. Não parece haver uma boa maneira de fazer isso à prova do futuro; portanto, uma lista de permissões parece ser a melhor opção.
Isso registra o elemento no final da fase de bolha do evento; portanto, se você quiser manipular o Backspace de qualquer maneira personalizada, poderá fazê-lo em outros manipuladores.
Isso também verifica a instância do HTMLTextAreElement, pois, teoricamente, é possível ter um componente da Web que herda disso.
Isso não verifica o contentEditable (combine com outras respostas).
https://jsfiddle.net/af2cfjc5/15/
fonte
Ponto do site: desativar novamente para Javascript
event.stopPropagation()
eevent.preventDefault()
não faça nada no IE. Eu tive que enviar retornoevent.keyCode == 11
(eu só peguei algo) em vez de apenas dizer"if not = 8, run the event"
para fazê-lo funcionar, no entanto.event.returnValue = false
também funciona.fonte
Outro método usando jquery
fonte
Estou usando isso no meu código há algum tempo. Escrevo testes on-line para os alunos e me deparei com o problema quando eles pressionavam o backspace durante o teste, e isso os levava de volta à tela de login. Frustrante! Funciona no FF, com certeza.
fonte