Aktualisiert am 5. September 2010
Da hier anscheinend alle für dieses Problem verwiesen werden, füge ich meine Antwort einer ähnlichen Frage hinzu, die denselben Code wie diese Antwort enthält, jedoch den vollständigen Hintergrund für diejenigen bietet, die interessiert sind:
Die document.selection.createRange des IE enthält keine führenden oder nachfolgenden Leerzeilen
Das Berücksichtigen von Zeilenumbrüchen ist im IE schwierig, und ich habe keine Lösung gefunden, die dies korrekt ausführt, einschließlich anderer Antworten auf diese Frage. Es ist jedoch möglich, die folgende Funktion zu verwenden, die Ihnen den Anfang und das Ende der Auswahl (die im Fall eines Carets gleich sind) innerhalb eines <textarea>
oder eines Textes zurückgibt <input>
.
Beachten Sie, dass der Textbereich den Fokus haben muss, damit diese Funktion im IE ordnungsgemäß funktioniert. Rufen Sie im Zweifelsfall focus()
zuerst die Methode des Textbereichs auf .
function getInputSelection(el) {
var start = 0, end = 0, normalizedValue, range,
textInputRange, len, endRange;
if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
start = el.selectionStart;
end = el.selectionEnd;
} else {
range = document.selection.createRange();
if (range && range.parentElement() == el) {
len = el.value.length;
normalizedValue = el.value.replace(/\r\n/g, "\n");
// Create a working TextRange that lives only in the input
textInputRange = el.createTextRange();
textInputRange.moveToBookmark(range.getBookmark());
// Check if the start and end of the selection are at the very end
// of the input, since moveStart/moveEnd doesn't return what we want
// in those cases
endRange = el.createTextRange();
endRange.collapse(false);
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
start = end = len;
} else {
start = -textInputRange.moveStart("character", -len);
start += normalizedValue.slice(0, start).split("\n").length - 1;
if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
end = len;
} else {
end = -textInputRange.moveEnd("character", -len);
end += normalizedValue.slice(0, end).split("\n").length - 1;
}
}
}
}
return {
start: start,
end: end
};
}