2009-12-30 11 views
14

Sto cercando un modo per impostare una selezione in un'area di testo in Internet Explorer. In altri browser, questo funziona bene:Imposta selezione textarea in Internet Explorer

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

In IE, suppongo devo usare createRange e regolare la selezione in qualche modo, ma non riesco a capire come.

Punti bonus extra per un collegamento a una documentazione corretta su createRange e metodi associati, MSDN non aiuta molto.

+0

+1 - Ho guardato questo. Non riesco a ricordare i dettagli (mi dispiace) ma è appiccicoso. IE era molto inutile. Ho dovuto fare una sorta di compromesso nel mio design del modulo. – martinr

risposta

18

questo funziona per me:

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

Link utili:

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

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

+3

Eccellente, funziona davvero. 'moveEnd' apparentemente sposta la selezione rispetto alla posizione iniziale, quindi si comporta diversamente da' .selectionEnd'. Ottimi collegamenti, grazie! Spero che i punti bonus che ho promesso verranno ottenuti tramite l'upvoting di altre persone :) –

17

Prova 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 per creare una funzione sensibile al browser e spostare prima la fine, quindi non è richiesta alcuna aritmetica. È un peccato che non posso accettare due risposte come corrette, watain è stato il primo e fornito link :) –

+1

Grazie. Lo so, watain è stato il primo e ha fornito alcuni collegamenti alla documentazione, quindi la sua risposta è quella da contrassegnare come accettata. – Rafael

+0

Il riutilizzo del nome variabile "e" mi ha gettato via, ma penso di vedere quello che stai facendo lì. – MarkHu

0

Attenzione ai separatori di linea, spostare i metodi * li vedono come un personaggio, ma sono in realtà due - \ r \ n

6

Come già commentato, i metodi di spostamento visualizzano i separatori di riga come un carattere (\n) anziché due (\r\n). Ho modificato la routine per compensare che:

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

Funziona alla grande! Grazie. – Vasyl