En JavaScript, es posible seleccionar texto mediante programación en un elemento input
o textarea
. Puede enfocar una entrada con ipt.focus()
y luego seleccionar su contenido con ipt.select()
. Incluso puede seleccionar un rango específico con ipt.setSelectionRange(from,to)
.
Mi pregunta es: ¿hay alguna forma de hacer esto también en un contenteditable
elemento?
Descubrí que puedo hacer elem.focus()
, poner el símbolo de intercalación en un contenteditable
elemento, pero posteriormente ejecutarlo elem.select()
no funciona (ni tampoco setSelectionRange
). No puedo encontrar nada en la web al respecto, pero tal vez estoy buscando algo equivocado ...
Por cierto, si hace alguna diferencia, solo necesito que funcione en Google Chrome, ya que es para una extensión de Chrome.
fuente
selectElementContents()
asetTimeout()
orequestAnimationFrame()
si se llama desde unonfocus
. Ver jsfiddle.net/rudiedirkx/MgASG/1/showfocus()
.Además de la respuesta de Tim Downs , hice una solución que funciona incluso en oldIE:
Probado en IE 8+, Firefox 3+, Opera 9+ y Chrome 2+. Incluso lo configuré en un complemento jQuery:
... y a quién le interesa, esto es lo mismo para todos los adictos al café:
Actualizar:
Si desea seleccionar la página completa o el contenido de una región editable (marcada con
contentEditable
), puede hacerlo mucho más simple cambiando aydesignMode
usandodocument.execCommand
:Hay un buen punto de partida en MDN y una pequeña documentación .
(funciona bien en IE6 +, Opera 9+, Firefoy 3+, Chrome 2+) http://caniuse.com/#search=execCommand
fuente
Dado que todas las respuestas existentes tratan con
div
elementos, explicaré cómo hacerlo conspan
s.Existe una sutil diferencia al seleccionar un rango de texto en un
span
. Para poder pasar el índice de inicio y finalización del texto, debe usar unText
nodo, como se describe aquí :fuente
r.setStart(e.firstChild,0); r.setEnd(e.lastChild,e.lastChild.textContent.length);
Por supuesto, debería comprobar que e.firstChild en realidad no sea nulo.<div>
y un<span>
elemento. Al menos, no como lo describe.Rangy te permite hacer este cross-browser con el mismo código. Rangy es una implementación de varios navegadores de los métodos DOM para las selecciones. Está bien probado y hace que esto sea mucho menos doloroso. Me niego a tocar contenteditable sin él.
Puedes encontrar rangy aquí:
http://code.google.com/p/rangy/
Con rangy en su proyecto, siempre puede escribir esto, incluso si el navegador es IE 8 o anterior y tiene una API nativa completamente diferente para las selecciones:
Donde "contentEditableNode" es el nodo DOM que tiene el atributo contenteditable. Puede buscarlo así:
O si jQuery ya es parte de su proyecto y lo encuentra conveniente:
fuente
La forma moderna de hacer las cosas es así. Más detalles sobre MDN
fuente
[Actualizado para corregir el error]
Aquí hay un ejemplo que está adaptado de esta respuesta que parece funcionar bien en Chrome: seleccione el rango en div contenteditable
HTML es:
fuente