本文详解如何在JavaScript中处理TextArea的选中区域,涵盖获取起点与设置范围。针对非IE浏览器(如Firefox、Chrome)利用selectionStart/setSelectionRange,对IE浏览器则通过TextRange对象及compareEndPoints方法实现兼容处理,并附带完整代码示例。
获取TextArea选中区域起点
在非IE浏览器(如Firefox、Chrome)中,可以通过selectionStart属性直接获取选中区域的起始位置;而在IE浏览器中,由于不支持该属性,需借助TextRange对象,利用其compareEndPoints方法比较端点来实现起点定位。
具体实现逻辑如下:
getStartPos : function( textarea )
{
if ( typeof textarea.selectionStart != 'undefined' )
{ // 非IE
start = textarea.selectionStart;
}
else
{ // IE
var range = document.selection.createRange();
var range_textarea = document.body.createTextRange();
range_textarea .moveToElementText(textarea);
//比较start point
for ( var sel_start = 0; range_textarea .compareEndPoints('StartToStart' , range) < 0; sel_start++)
range_textarea .moveStart( 'character', 1);
start = sel_start;
} // else
return start;
} 需注意,在Chrome浏览器中,若textarea被设置为readonly,则不会显示输入光标,此时selectionStart与selectionEnd均返回0;而在Firefox中表现正常。
(二)设置Textarea中选中的区域
设置TextArea选中区域
类似地,非IE浏览器支持setSelectionRange方法来指定选中字符范围,而IE浏览器不支持此方法,需通过TextRange进行操作。此处需特别注意IE下Textarea选中区间的相对位置问题。以下代码先通过moveStart和moveEnd将起点与终点均设为0,再调用collapse使插入光标生效(起点不变),随后先moveEnd移动区间终点,再moveStart移动区间起点,在未改变起点point之前,可保证相对位置不变,逻辑更清晰。
具体代码如下:
/**
* 设置textarea的选中区域
*/
setSelectRange : function( textarea, start, end )
{
if ( typeof textarea.createTextRange != 'undefined' )// IE
{
var range = textarea.createTextRange();
// 先把相对起点移动到0处
range.moveStart( "character", 0)
range.moveEnd( "character", 0);
range.collapse( true); // 移动插入光标到start处
range.moveEnd( "character", end);
range.moveStart( "character", start);
range.select();
} // if
else if ( typeof textarea.setSelectionRange != 'undefined' )
{
textarea.setSelectionRange(start, end);
textarea.focus();
} // else
} 在实现获取与设置选中区域的方法后,文字插入、替换等功能即可基于此轻松实现。