Eu tenho um editor básico baseado em execCommand
seguir o exemplo apresentado aqui. Existem três maneiras de colar texto dentro da execCommand
área:
- Ctrl+V
- Clique com o botão direito -> Colar
- Clique com o botão direito -> Colar como texto simples
Quero permitir a colagem apenas de texto sem formatação, sem nenhuma marcação HTML. Como posso forçar as duas primeiras ações a colar Texto Simples?
Solução possível: a maneira que posso imaginar é definir o ouvinte para eventos de ativação para ( Ctrl+ V) e remover as tags HTML antes de colar.
- É a melhor solução?
- É à prova de balas evitar qualquer marcação HTML na colagem?
- Como adicionar ouvinte ao botão direito -> colar?
javascript
html
dom-events
execcommand
Googlebot
fonte
fonte
Respostas:
Ele irá interceptar o
paste
evento, cancelar opaste
e inserir manualmente a representação de texto da área de transferência:http://jsfiddle.net/HBEzc/ . Este deve ser o mais confiável:
Não tenho certeza do suporte cross-browser, no entanto.
fonte
text
contiver HTML (por exemplo, se você copiar o código HTML como texto simples), ele irá realmente colá-lo como HTML. Aqui está uma solução para isso, mas não é muito bonita: jsfiddle.net/HBEzc/3 .var text = (event.originalEvent || event).clipboardData.getData('text/plain');
oferece um pouco mais de compatibilidade entre navegadores<div></div>
o conteúdo será adicionado como um elemento filho do elemento contenteditable. Eu consertei assim:document.execCommand("insertText", false, text);
insertHTML
einsertText
não trabalho no IE11, masdocument.execCommand('paste', false, text);
funciona bem. Embora isso pareça não funcionar em outros navegadores> _>.Não consegui obter a resposta aceita aqui para funcionar no IE, então fiz algumas pesquisas e cheguei a esta resposta que funciona no IE11 e nas versões mais recentes do Chrome e Firefox.
fonte
Uma solução próxima como pimvdb. Mas está funcionando no FF, Chrome e IE 9:
fonte
content
atribuição de variáveis de curto-circuito . Descobri que usargetData('Text')
o navegador cruzado funciona, então você poderia fazer essa atribuição apenas uma vez, assim:var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
Então você só teria que usar a lógica para o comando colar / inserir do navegador cruzado.document.selection.createRange().pasteHTML(content)
... apenas testei no IE11 e não funciona assim.document.execCommand('insertText', false, content)
não funciona a partir do IE11 e do Edge. Além disso, as versões mais recentes do Chrome agora são compatíveisdocument.execCommand('paste', false, content)
, o que é mais simples. Eles podem estar obsoletosinsertText
.Claro que a pergunta já foi respondida e o tópico é muito antigo, mas quero fornecer minha solução, pois é simples e limpa:
Isso está dentro do meu evento de colagem em meu div contenteditable.
A outra parte é de outro SO-post que não consegui encontrar mais ...
ATUALIZAÇÃO 19.11.2014: O outro SO-post
fonte
Nenhuma das respostas postadas realmente parece funcionar em qualquer navegador ou a solução é muito complicada:
insertText
não é compatível com o IEpaste
comando resulta em erro de estouro de pilha no IE11O que funcionou para mim (IE11, Edge, Chrome e FF) é o seguinte:
Observe que o manipulador de colagem personalizado é necessário / funcionando apenas para
contenteditable
nós. Como os campostextarea
e osinput
campos simples não suportam a colagem de conteúdo HTML, nada precisa ser feito aqui.fonte
.originalEvent
manipulador de eventos (linha 3) para fazer isso funcionar. Então os olhares linha completa assim:const text = ev.clipboardData ? ev.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
. Funciona na versão mais recente do Chrome, Safari, Firefox.O Firefox não permite que você acesse os dados da área de transferência, então você precisará fazer um 'hack' para fazê-lo funcionar. Não consegui encontrar uma solução completa, no entanto, você pode corrigi-lo para ctrl + v pastas criando uma área de texto e colando nela:
fonte
Eu também estava trabalhando em uma pasta de texto simples e comecei a odiar todos os erros execCommand e getData, então decidi fazer da maneira clássica e funciona perfeitamente:
O código com minhas anotações pode ser encontrado aqui: http://www.albertmartin.de/blog/code.php/20/plain-text-paste-with-javascript
fonte
O código acima funciona para mim no IE10 e no IE11 e agora também funciona no Chrome e Safari. Não testado no Firefox.
fonte
No IE11, execCommand não funciona bem. Eu uso o código abaixo para o IE11
<div class="wmd-input" id="wmd-input-md" contenteditable=true>
é minha caixa div.Eu leio os dados da área de transferência de window.clipboardData, modifico o textContent do div e dou o cursor.
Eu dou tempo limite para definir o acento circunflexo, porque se eu não definir o tempo limite, um acento circunflexo vai para o final de div.
e você deve ler clipboardData no IE11 da maneira abaixo. Se você não fizer isso, o caractere de nova linha não será tratado corretamente, então o cursor dá errado.
Testado no IE11 e Chrome. Pode não funcionar no IE9
fonte
Depois de pesquisar e tentar, encontrei de alguma forma a solução ideal
fonte
OK, pois todos estão tentando contornar os dados da área de transferência, verificando o evento de pressionamento de tecla e usando execCommand.
Eu pensei nisso
CÓDIGO
fonte