Да, иметь дело с выбором полей ввода в разных браузерах - раздражение, тем более что в IE есть несколько методов, которые выглядят так, как будто они должны работать, но на самом деле это не так. (В частности, объединение с использованием setEndPoint
, затем измерение length
, которое выглядит нормально, пока выбор не начнется или не закончится в новых строках.)
Вот пара служебных функций, которые я использую для выбора входных данных. Возвращает значение входного значения, разбитого на биты, которые находятся до, внутри и после выделения (при этом выборка считается пустой строкой в позиции фокуса ввода, если это не выбор). Это позволяет довольно просто заменять и вставлять контент в нужную точку, одновременно решая проблему IE CRLF.
(Может быть, jQuery делает что-то подобное, но я еще не встречал его.)
// getPartitionedValue: for an input/textarea, return the value text, split into
// an array of [before-selection, selection, after-selection] strings.
//
function getPartitionedValue(input) {
var value= input.value;
var start= input.value.length;
var end= start;
if (input.selectionStart!==undefined) {
start= input.selectionStart;
end= input.selectionEnd;
} else if (document.selection!==undefined) {
value= value.split('\r').join('');
start=end= value.length;
var range= document.selection.createRange();
if (range.parentElement()===input) {
var start= -range.moveStart('character', -10000000);
var end= -range.moveEnd('character', -10000000);
range.moveToElementText(input);
var error= -range.moveStart('character', -10000000);
start-= error;
end-= error;
}
}
return [
value.substring(0, start),
value.substring(start, end),
value.substring(end)
];
}
// setPartitionedValue: set the value text and selected region in an input/
// textarea.
//
function setPartitionedValue(input, value) {
var oldtop= input.scrollTop!==undefined? input.scrollTop : null;
input.value= value.join('');
input.focus();
var start= value[0].length;
var end= value[0].length+value[1].length;
if (input.selectionStart!==undefined) {
input.selectionStart= start;
input.selectionEnd= end;
if (oldtop!==null)
input.scrollTop= oldtop;
}
else if (document.selection!==undefined) {
var range= input.createTextRange();
range.collapse(true);
range.moveEnd('character', end);
range.moveStart('character', start);
range.select();
}
}