//=======================================
//功能: 滾動文本框精確位置定位
//輸入參數:
//?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();
?}
?
}
posted on 2007-03-16 15:47
LORD BLOG 閱讀(572)
評論(0) 編輯 收藏 所屬分類:
項目筆記