萤火虫 发表于 2008-12-30 11:14:49

如何选中滚动文本框从某一行到某一行

//========================
//功能: 滚动文本框精确位置定位
//输入参数:
// 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 = ;
startx = src.createTextRange().getClientRects().left;
starty = src.createTextRange().getClientRects().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 = 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;

if (st > _startPoint){
   st = st   _startPoint;
}else{
   var _rightTextLen = 0;
   for (var m = 0; m < conts.length; m){
    if (conts < _startPoint){
   _rightTextLen = _startPoint - conts;
   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;
   if (_endPoint > 0){
    var laLineLen = conts - conts;
    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();
}

}
页: [1]
查看完整版本: 如何选中滚动文本框从某一行到某一行