| |
//======================== //功能: 滚动文本框精确位置定位 //输入参数: // 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(); } }
|
|