Mis À Jour Le 5 Septembre 2010
Voyant que tout le monde semble l'avoir dirigé ici pour ce problème, je vais ajouter ma réponse à une question similaire, qui contient le même code que cette réponse, mais avec un arrière-plan pour ceux qui sont intéressés:
IE document.sélection.createRange ne comprend pas de leader ou suiveur de lignes vides
De compte pour la fuite des sauts de ligne est délicate dans IE, et je n'ai pas vu de solution qui fait cela correctement, y compris toutes les autres réponses à cette question. Il est cependant possible, à l'aide de la fonction suivante, qui va vous retourner le début et la fin de la sélection (qui sont les mêmes dans le cas d'un accent circonflexe) au sein d'un <textarea>
ou texte <input>
.
Notez que le textarea doit avoir le focus pour que cette fonction fonctionne correctement sous IE. En cas de doute, appelez le textarea de l' focus()
d'abord la méthode.
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
};
}