Em JavaScript, é possível selecionar texto de forma programática em um elemento input
ou textarea
. Você pode focar uma entrada com ipt.focus()
e selecionar seu conteúdo com ipt.select()
. Você pode até selecionar um intervalo específico com ipt.setSelectionRange(from,to)
.
Minha pergunta é: existe alguma maneira de fazer isso em um contenteditable
elemento também?
Descobri que posso fazer elem.focus()
, colocar o cursor em um contenteditable
elemento, mas posteriormente a execução elem.select()
não funciona (e nem funciona setSelectionRange
). Não consigo encontrar nada sobre isso na web, mas talvez eu esteja procurando a coisa errada ...
Aliás, se faz alguma diferença, só preciso que funcione no Google Chrome, pois se trata de uma extensão do Chrome.
fonte
selectElementContents()
asetTimeout()
ourequestAnimationFrame()
se for chamado deonfocus
. Veja jsfiddle.net/rudiedirkx/MgASG/1/showfocus()
.Além da resposta de Tim Downs , criei uma solução que funciona até no antigo IE:
Testado em IE 8+, Firefox 3+, Opera 9+ e Chrome 2+. Até eu o configurei em um plugin jQuery:
... e quem está interessado em, aqui está o mesmo para todos os viciados em café:
Atualizar:
Se quiser selecionar a página inteira ou o conteúdo de uma região editável (marcada com
contentEditable
), você pode fazer isso de forma muito mais simples alternando paradesignMode
e usandodocument.execCommand
:Há um bom ponto de partida no MDN e uma pequena documentação .
(funciona bem no IE6 +, Opera 9+, Firefoy 3+, Chrome 2+) http://caniuse.com/#search=execCommand
fonte
Como todas as respostas existentes lidam com
div
elementos, explicarei como fazer isso comspan
s.Há uma diferença sutil ao selecionar um intervalo de texto em a
span
. Para poder passar o índice inicial e final do texto, você deve usar umText
nó, conforme descrito aqui :fonte
r.setStart(e.firstChild,0); r.setEnd(e.lastChild,e.lastChild.textContent.length);
claro que você deve verificar se e.firstChild não é realmente nulo.<div>
e em um<span>
elemento. Pelo menos, não como você descreve.O Rangy permite que você faça esse cross-browser com o mesmo código. Rangy é uma implementação entre navegadores dos métodos DOM para seleções. É bem testado e torna isso muito menos doloroso. Recuso-me a tocar em conteúdo editável sem ele.
Você pode encontrar rangy aqui:
http://code.google.com/p/rangy/
Com o rangy em seu projeto, você sempre pode escrever isso, mesmo se o navegador for IE 8 ou anterior e tiver uma API nativa completamente diferente para as seleções:
Onde "contentEditableNode" é o nó DOM que possui o atributo contenteditable. Você pode buscá-lo assim:
Ou se jQuery já faz parte do seu projeto e você achar conveniente:
fonte
A maneira moderna de fazer as coisas é assim. Mais detalhes sobre MDN
fonte
[Atualizado para corrigir o erro]
Aqui está um exemplo adaptado a partir desta resposta que parece funcionar bem no Chrome - Selecione o intervalo em div contenteditable
HTML é:
fonte