Javascript设置和获取Textarea的光标位置的方法

  1. <html><head>  
  2. <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />  
  3. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  4. <title>JS设置及获取Textarea的光标位置</title>  
  5.   <script>  
  6.     var isIE = !(!document.all);  
  7.     function posCursor(){  
  8.       var start=0,end=0;   
  9.       var oTextarea = document.getElementById("textarea");  
  10.       if(isIE){  
  11.         //selection 当前激活选中区,即高亮文本块,和/或文当中用户可执行某些操作的其它元素。  
  12.         //createRange 从当前文本选中区中创建 TextRange 对象,  
  13.         //或从控件选中区中创建 controlRange 集合。  
  14.         var sTextRangedocument.selection.createRange();  
  15.   
  16.         //判断选中的是不是textarea对象  
  17.         if(sTextRange.parentElement()== oTextarea){  
  18.           //创建一个TextRange对象  
  19.           var oTextRange = document.body.createTextRange();  
  20.           //移动文本范围以便范围的开始和结束位置能够完全包含给定元素的文本。  
  21.           oTextRange.moveToElementText(oTextarea);  
  22.             
  23.           //此时得到两个 TextRange  
  24.           //oTextRange文本域(textarea)中文本的TextRange对象  
  25.           //sTextRange是选中区域文本的TextRange对象  
  26.       
  27.           //compareEndPoints方法介绍,compareEndPoints方法用于比较两个TextRange对象的位置  
  28.           //StartToEnd  比较TextRange开头与参数TextRange的末尾。  
  29.           //StartToStart比较TextRange开头与参数TextRange的开头。  
  30.           //EndToStart  比较TextRange末尾与参数TextRange的开头。  
  31.           //EndToEnd    比较TextRange末尾与参数TextRange的末尾。  
  32.       
  33.           //moveStart方法介绍,更改范围的开始位置  
  34.           //character 按字符移动  
  35.           //word       按单词移动  
  36.           //sentence  按句子移动  
  37.           //textedit  启动编辑动作  
  38.       
  39.           //这里我们比较oTextRange和sTextRange的开头,的到选中区域的开头位置  
  40.           for (start=0; oTextRange.compareEndPoints("StartToStart", sTextRange) < 0; start++){   
  41.             oTextRange.moveStart('character', 1);   
  42.           }  
  43.           //需要计算一下\n的数目(按字符移动的方式不计\n,所以这里加上)   
  44.           for (var i = 0; i <= start; i ++){  
  45.             if (oTextarea.value.charAt(i) == '\n'){   
  46.               start++;   
  47.             }  
  48.           }   
  49.       
  50.           //再计算一次结束的位置  
  51.           oTextRange.moveToElementText(oTextarea);   
  52.           for (end = 0; oTextRange.compareEndPoints('StartToEnd', sTextRange) < 0; end ++){  
  53.             oTextRange.moveStart('character', 1);  
  54.           }  
  55.           for (var i = 0; i <= end; i ++){  
  56.             if (oTextarea.value.charAt(i) == '\n'){   
  57.               end++;   
  58.             }  
  59.           }  
  60.         }  
  61.       }else{  
  62.         start = oTextarea.selectionStart;  
  63.         end = oTextarea.selectionEnd;  
  64.       }  
  65.       document.getElementById("start").value = start;   
  66.       document.getElementById("end").value = end;  
  67.     }  
  68.       
  69.       
  70.     function moveCursor(){  
  71.       var oTextarea = document.getElementById("textarea");  
  72.       var start = parseInt(document.getElementById("start").value);   
  73.       var end =  parseInt(document.getElementById("end").value);  
  74.       if(isNaN(start)||isNaN(end)){  
  75.         alert("位置输入错误");  
  76.       }  
  77.       if(isIE){  
  78.         var oTextRange = oTextarea.createTextRange();  
  79.         var LStart = start;  
  80.         var LEnd = end;  
  81.         var start = 0;  
  82.         var end = 0;  
  83.         var value = oTextarea.value;  
  84.         for(var i=0; i<value.length && i<LStart; i++){  
  85.           var c = value.charAt(i);  
  86.           if(c!='\n'){  
  87.             start++;  
  88.           }  
  89.         }  
  90.         for(var i=value.length-1; i>=LEnd && i>=0; i--){  
  91.           var c = value.charAt(i);  
  92.           if(c!='\n'){  
  93.             end++;  
  94.           }  
  95.         }  
  96.         oTextRange.moveStart('character', start);  
  97.         oTextRange.moveEnd('character', -end);  
  98.         //oTextRange.collapse(true);  
  99.         oTextRange.select();  
  100.         oTextarea.focus();  
  101.       }else{  
  102.         oTextarea.select();  
  103.         oTextarea.selectionStart=start;  
  104.         oTextarea.selectionEnd=end;  
  105.       }  
  106.     }   
  107.   </script>  
  108.   <body>  
  109.     <table border="1" cellspacing="0" cellpadding="0">   
  110.       <tr>   
  111.         <td>start: <input type="text" id="start" size="3" value="0"/></td>   
  112.         <td>end:   <input type="text" id="end"   size="3" value="0"/></td>   
  113.       </tr>   
  114.       <tr>   
  115.       <td colspan="2">   
  116.         <textarea id="textarea"  
  117.           onKeydown="posCursor()"   
  118.           onKeyup="posCursor()"   
  119.           onmousedown="posCursor()"   
  120.           onmouseup="posCursor()"   
  121.           onfocus="posCursor()"   
  122.           rows="14"  
  123.           cols="50">虞美人  
  124. 春花秋月何时了,往事知多少。  
  125. 小楼昨夜又东风,故国不堪回首月明中!  
  126. 雕l栏玉砌应犹在,只是朱颜改。  
  127. 问君能有几多愁?恰似一江春水向东流。</textarea>   
  128.         </td>   
  129.       </tr>   
  130.       <tr>   
  131.         <td></td>   
  132.         <td><input type="button" onClick="moveCursor()" value="设置光标位置"/></td>   
  133.       </tr>   
  134.     </table>   
  135.   </body>  
  136. </html>  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值