2009-12-30 11 views
14

Estoy buscando una forma de establecer una selección en un área de texto en Internet Explorer. En otros navegadores, esto funciona muy bien:Establecer la selección de textarea en Internet Explorer

textarea.selectionStart = start; 
textarea.selectionEnd = end; 

En IE, supongo que tengo que usar createRange y ajustar la selección de alguna manera, pero no puedo encontrar la manera.

Puntos extra de bonificación por un enlace a una documentación adecuada sobre createRange y métodos asociados, MSDN no está ayudando mucho.

+0

+1 - Miré esto. No recuerdo los detalles (lo siento) pero es pegajoso. IE estaba siendo muy inútil. Tuve que hacer algún tipo de compromiso en mi diseño de formulario. – martinr

Respuesta

18

Esto funciona para mí:

<textarea id="lol"> 
noasdfkvbsdobfbgvobosdobfbgoasopdobfgbooaodfgh 
</textarea> 

<script> 
var range = document.getElementById('lol').createTextRange(); 
range.collapse(true); 
range.moveStart('character', 5); 
range.moveEnd('character', 10); 
range.select(); 
</script> 

Enlaces de interés:

MoveStart() en M SDN: http://msdn.microsoft.com/en-us/library/ms536623%28VS.85%29.aspx

MoveEnd() en MSDN: http://msdn.microsoft.com/en-us/library/ms536620%28VS.85%29.aspx

+3

Excelente, realmente funciona. 'moveEnd' aparentemente mueve la selección relativa a la posición de inicio, por lo que se comporta de forma diferente a' .selectionEnd'. Grandes enlaces, gracias! Con suerte, los puntos de bonificación que prometí vendrán a través de otras personas votando :) –

17

intento con

function select(e, start, end){ 
    e.focus(); 
    if(e.setSelectionRange) 
     e.setSelectionRange(start, end); 
    else if(e.createTextRange) { 
     e = e.createTextRange(); 
     e.collapse(true); 
     e.moveEnd('character', end); 
     e.moveStart('character', start); 
     e.select(); 
    } 
} 
select(document.getElementById('textarea_id'), 5, 10); 
+1

+1 para crear una función que tenga en cuenta el navegador y mover el extremo primero para que no se requiera aritmética. Es una lástima que no puedo aceptar dos respuestas como correcta, watain fue el primero y proporcionó enlaces :) –

+1

Gracias. Lo sé, Watain fue el primero y proporcionó algunos enlaces a la documentación, por lo que su respuesta es la que se marcará como aceptada. – Rafael

+0

La reutilización del nombre de variable 'e' me echó, pero creo que veo lo que estás haciendo allí. – MarkHu

0

Cuidado con los separadores de línea, mueva métodos * Los ven como un personaje, pero en realidad son dos - \ r \ n

6

Como ya se comentó, los métodos de movimiento ven los separadores de línea como un carácter (\n) en lugar de dos (\r\n). He ajustado la rutina para compensar eso:

function select(el, start, end) { 
    el.focus(); 

    if (el.setSelectionRange) { 
     el.setSelectionRange(start, end); 
    } 
    else { 
     if(el.createTextRange) { 
      var normalizedValue = el.value.replace(/\r\n/g, "\n"); 

      start -= normalizedValue.slice(0, start).split("\n").length - 1; 
      end -= normalizedValue.slice(0, end).split("\n").length - 1; 

      range=el.createTextRange(); 
      range.collapse(true); 
      range.moveEnd('character', end); 
      range.moveStart('character', start); 
      range.select(); 
     } 
    } 
} 
+0

¡Funciona muy bien! Gracias. – Vasyl

Cuestiones relacionadas