2009-12-30 9 views
14

Je suis à la recherche d'un moyen de mis une sélection dans une zone de texte dans Internet Explorer. Dans d'autres navigateurs, cela fonctionne très bien:régler la sélection textarea dans Internet Explorer

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

Dans IE, je suppose que je dois utiliser createRange et ajuster la sélection en quelque sorte, mais je ne peux pas comprendre comment.

points bonus supplémentaires pour un lien vers une documentation appropriée sur createRange et méthodes associées, MSDN ne contribue pas à beaucoup.

+0

+1 - J'ai regardé ceci. Je ne me souviens pas des détails (désolé) mais c'est collant. IE était très inutile. J'ai dû faire une sorte de compromis dans ma conception de formulaire. – martinr

Répondre

18

Cela fonctionne pour moi:

<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> 

Liens utiles:

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

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

+3

Excellent, cela fonctionne réellement. 'moveEnd' déplace apparemment la sélection par rapport à la position de départ, donc il se comporte différemment de' .selectionEnd'. Super liens, merci! Espérons que les points de bonus que j'ai promis viendront par l'intermédiaire d'autres personnes upvoting :) –

17

Essayez avec

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 pour créer une fonction de navigateur et déplacer la fin en premier, donc pas d'arithmétique n'est pas nécessaire. C'est dommage que je ne puisse pas accepter deux réponses comme correctes, watain était le premier et a fourni des liens :) –

+1

Merci. Je sais, Watain était le premier et a fourni quelques liens vers la documentation, donc sa réponse est celle qui doit être marquée comme acceptée. – Rafael

+0

La réutilisation du nom de variable «e» m'a ébranlé, mais je pense que je vois ce que vous faites là. – MarkHu

0

Méfiez-vous des séparateurs de ligne, déplacer des méthodes * les voient comme un caractère, mais ils sont en fait deux - \ r \ n

6

Comme déjà commenté les méthodes de déplacement voient les séparateurs de ligne comme un caractère (\n) au lieu de deux (\r\n). J'ai ajusté la routine pour compenser cela:

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

Fonctionne bien! Je vous remercie. – Vasyl