//========================
//功能: 滚动文本框精确位置定位
//输入参数:
// self 滚动文本框对象
// _startline 开始行数
// _endline 结束行数
// _startpoint 开始行数的开始位置
// _endpoint 结束行数的结束位置
//调用方法:
// ①同一行,从开始位置到结束位置:
// seltolinepoint(self, 2, 2, 0/1, 0)
// ②不同一行,从某一开始位置到结束位置:
// seltolinepoint(self, 2, 4, 3, 0)
// ③不同一行,从某一开始位置到某一结束位置:
// seltolinepoint(self, 2, 4, 3, 9)
//========================
function seltolinepoint(self, _startline, _endline, _startpoint, _endpoint, _len){
var src = self;
var otr = self.createtextrange();
var text = self.innertext;
var textlength = text.length;
conts = [0];
startx = src.createtextrange().getclientrects()[0].left;
starty = src.createtextrange().getclientrects()[0].top;
stepy = 3; //光标向下移动的步长,不能大于textarea中的字高
currentscr = 0; //当前滚动条位置
stepscr = 30; //滚动条向下滚动的步长,不能大于textarea的高度
while(1){
src.scrolltop = currentscr
currenty = starty
while(1){ //光标从textarea内容的开头开始向下移动,遍历各行,在conts[]中记下各换行位置
otr.movetopoint(startx, currenty)
otr.moveend("character", textlength)
var _otr_line_length = otr.text.length;
cont = textlength - _otr_line_length;
if (cont >= textlength){
break
}
if (cont>conts[conts.length - 1]){
conts[conts.length] = cont
}
currenty += stepy
}
if (currentscr >= src.scrollheight){
break
}
currentscr += stepscr;
}
if (_endline == "")
_endline = _startline;
_startline = parseint(_startline);
_endline = parseint(_endline);
if (isfinite(_startline) && isfinite(_endline) && _startline > 0 && _endline > 0){
//检查参数有效性
if (_startline > conts.length || _endline > conts.length){
alert("总共只有" + conts.length + "行,请检查后重试。");
return;
}
//如果结束行在开始行之前,强行调整参数
if (_endline < _startline){
_endline = _startline;
end.value = _endline;
}
src.scrolltop = 0;
otr.movetopoint(startx, starty); //光标回到textarea内容的开头
st = conts[_startline - 1];
if (st > _startpoint){
st = st + _startpoint;
}else{
var _righttextlen = 0;
for (var m = 0; m < conts.length; m++){
if (conts[m] < _startpoint){
_righttextlen = _startpoint - conts[m];
st = _startpoint - _righttextlen;
if (_endline == _startline){
_endline++;
}
}else{
break;
}
}
if (st + _righttextlen < textlength){
st = st + _righttextlen;
}
}
texprestart = text.substr(0, st);
texprestart = text.substr(0, st).replace(//r/g, ""); //自textarea内容的开头至选择起点前的字串,由于movestart方法将/r/n视为一个字符,需要修正计数
st = texprestart.length;
otr.movestart("character", st);
en = textlength;
if (_endline < conts.length){
en = conts[_endline];
if (_endpoint > 0){
var lalinelen = conts[_endline] - conts[_endline -1];
en = en - lalinelen + _endpoint;
}
}
texpreend = text.substr(0, en).replace(//r/g,"") //自textarea内容的开头至选择结束点前的字串,由于moveend方法将/r/n视为一个字符,需要修正计数
en = texpreend.length
var _endx = en - st;
otr.moveend("character", _endx);
otr.select();
}
}
闽公网安备 35060202000074号