15 Stimmen

Textfeldauswahl im Internet Explorer festlegen

Ich suche nach einem Weg, um einstellen. eine Auswahl in einer Textarea im Internet Explorer. In anderen Browsern funktioniert dies einwandfrei:

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

Ich nehme an, dass ich im IE Folgendes verwenden muss createRange und die Auswahl irgendwie anpassen, aber ich weiß nicht, wie.

Extra-Bonuspunkte für einen Link zu einer geeigneten Dokumentation über createRange und die damit verbundenen Methoden, ist MSDN nicht sehr hilfreich.

18voto

watain Punkte 4388

Das funktioniert bei mir:

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

17voto

Rafael Punkte 18099

Versuchen Sie es 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);

6voto

Benjamin Wegman Punkte 455

Wie bereits kommentiert, sehen die Move-Methoden die Zeilentrenner als ein Zeichen ( \n ) anstelle von zwei ( \r\n ). Ich habe die Routine angepasst, um dies auszugleichen:

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();
        } 
    }
}

0voto

johan yong Punkte 1

Hüten Sie sich vor den Zeilentrennern, die move*-Methoden sehen sie als ein Zeichen, aber sie sind eigentlich zwei - \r\n

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X