注意:在firefox下 添加字符串的时候有个bug 就是scrollTop 会等于0,当然解决了,但是不够完美。如果有高手也研究过,麻烦指点下。 完整测试代码: 复制代码 代码如下: abcdefghijklmnopqrstuvwxyz// <![CDATA[<BR>var test = document.getElementById('testlujun');<BR>var TT = {<br><br> /*<BR> * 获取光标位置<BR> * @Method getCursorPosition<BR> * @param t element<BR> * @return number<BR> */<BR> getCursorPosition: function(t){<BR> if (document.selection) {<BR> t.focus();<BR> var ds = document.selection;<BR> var range = ds.createRange();<BR> var stored_range = range.duplicate();<BR> stored_range.moveToElementText(t);<BR> stored_range.setEndPoint("EndToEnd", range);<BR> t.selectionStart = stored_range.text.length - range.text.length;<BR> t.selectionEnd = t.selectionStart + range.text.length;<BR> return t.selectionStart;<BR> } else return t.selectionStart<BR> },<br><br> <BR> /*<BR> * 设置光标位置<BR> * @Method setCursorPosition<BR> * @param t element<BR> * @param p number<BR> * @return<BR> */<BR> setCursorPosition:function(t, p){<BR> this.sel(t,p,p);<BR> },<br><br> /*<BR> * 插入到光标后面<BR> * @Method add<BR> * @param t element<BR> * @param txt String<BR> * @return<BR> */<BR> add:function (t, txt){<BR> var val = t.value;<BR> if(document.selection){<BR> t.focus()<BR> document.selection.createRange().text = txt; <BR> } else {<BR> var cp = t.selectionStart;<BR> var ubbLength = t.value.length;<BR> var s = t.scrollTop;<BR> // document.getElementById('aaa').innerHTML += s + '<br />';<BR> t.value = t.value.slice(0,t.selectionStart) + txt + t.value.slice(t.selectionStart, ubbLength);<BR> this.setCursorPosition(t, cp + txt.length);<BR> // document.getElementById('aaa').innerHTML += t.scrollTop + '<br />';<BR> firefox=navigator.userAgent.toLowerCase().match(/firefox\/([\d\.]+)/) && setTimeout(function(){<BR> if(t.scrollTop != s) t.scrollTop=s;<BR> },0) <P> };<BR> },<br><br> <BR> /*<BR> * 删除光标 前面或者后面的 n 个字符<BR> * @Method del<BR> * @param t element<BR> * @param n number n>0 后面 n<0 前面<BR> * @return<BR> * 重新设置 value 的时候 scrollTop 的值会被清0<BR> */<BR> del:function(t, n){<BR> var p = this.getCursorPosition(t);<BR> var s = t.scrollTop;<BR> var val = t.value;<BR> t.value = n > 0 ? val.slice(0, p - n) + val.slice(p):<BR> val.slice(0, p) + val.slice(p - n);<BR> this.setCursorPosition(t ,p - (n < 0 ? 0 : n));<BR> firefox=navigator.userAgent.toLowerCase().match(/firefox\/([\d\.]+)/) && setTimeout(function(){<BR> if(t.scrollTop != s) t.scrollTop=s;<BR> },10)<BR> },<br><br> /*<BR> * 选中 s 到 z 位置的文字<BR> * @Method sel<BR> * @param t element<BR> * @param s number<BR> * @param z number<BR> * @return<BR> */<BR> sel:function(t, s, z){<BR> if(document.selection){<BR> var range = t.createTextRange();<BR> range.moveEnd('character', -t.value.length); <BR> range.moveEnd('character', z);<BR> range.moveStart('character', s);<BR> range.select();<BR> }else{<BR> t.setSelectionRange(s,z);<BR> t.focus();<BR> } <P> },<br><br> <BR> /*<BR> * 选中一个字符串<BR> * @Method sel<BR> * @param t element<BR> * @param s String<BR> * @return<BR> */<BR> selString:function(t, s){<BR> var index = t.value.indexOf(s);<BR> index != -1 ? this.sel(t, index, index + s.length) : false;<BR> } <P>}<BR>// ]]>