2009-12-30 4 views
14

Ich bin auf der Suche nach einem Weg zu eine Auswahl in einem Textfeld in Internet Explorer. In anderen Browsern funktioniert das ganz gut:Set textarea Auswahl in Internet Explorer

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

In IE, ich nehme an, ich habe createRange zu verwenden und die Auswahl irgendwie einstellen, aber ich kann nicht herausfinden, wie.

Zusätzliche Bonuspunkte für einen Link zu einer richtigen Dokumentation über createRange und zugehörige Methoden, MSDN hilft nicht viel.

+0

+1 - Ich sah dies an. Ich kann mich nicht an die Details erinnern (sorry), aber es ist klebrig. IE war sehr wenig hilfreich. Ich musste in meinem Formularentwurf einen Kompromiss eingehen. – martinr

Antwort

18

Dies funktioniert für mich:

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

Nützliche Links:

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

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

+3

Ausgezeichnet, es funktioniert tatsächlich. 'moveEnd' verschiebt scheinbar die Auswahl relativ zur Startposition, also verhält es sich anders als' .selectionEnd'. Tolle Links, danke! Hoffentlich werden die Bonuspunkte, die ich versprochen habe, durch andere Leute kommen, die upbooten :) –

17

Versuchen mit

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 für das Erstellen einer browserbewussten Funktion und das Bewegen des Endes zuerst, so dass keine Arithmetik benötigt wird. Es ist eine Schande, dass ich zwei Antworten nicht als richtig akzeptieren kann, watain war zuerst und lieferte Links :) –

+1

Danke. Ich weiß, Watain war der erste und hat einige Links zur Dokumentation geliefert, daher ist seine Antwort die, die als akzeptiert markiert wird. – Rafael

+0

Die Wiederverwendung des Variablennamens 'e' hat mich abgewimmelt, aber ich denke, ich sehe was du da machst. – MarkHu

0

von Zeilenseparatoren Vorsicht, bewegen * Methoden sie als ein Zeichen zu sehen, aber sie sind eigentlich zwei - \ r \ n

6

Wie bereits erwähnt, sehen die move-Methoden die Zeilentrennzeichen als ein Zeichen (\n) anstelle von zwei (\r\n). Ich habe die Routine angepasst, um das zu kompensieren:

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

Funktioniert gut! Vielen Dank. – Vasyl