一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

javascript 获取Textarea 元素的光标位置代码

时间:2010-11-26 编辑:简简单单 来源:一聚教程网





demo : textarea 元素的光标位置

textarea 元素的光标位置



     
  • 获取 textarea 元素当前的光标位置

  •    
  • 设置回原先的 textarea 元素的光标位置

  •    
  • 在 textarea 元素的光标位置插入文本


   
   


       
       
       
   


textarea range:



 

 
首先,我们用 rangedata 对象作为数据存储,并获得焦点:

 

var rangedata = {start: 0, end: 0, text: "" };textarea.focus();对于非 ie 浏览器获取选区的起始和末尾位置其实非常容易:

rangedata.start= el.selectionstart;rangedata.end = el.selectionend;通过截取我们可以得到光标的选区内容:

rangedata.text = (rangedata.start != rangedata.end) ? el.value.substring(rangedata.start, rangedata.end): "";而对于 ie 浏览器处理起来就比较麻烦了,但我们依旧可以获取到选区:

os = document.selection.createrange();同时还可获取 textarea 元素的选区:

// 为了使 or 与 os 在同一等级上比较,请勿使用:or = textarea.createtextrange()or = document.body.createtextrange();or.movetoelementtext(textarea);如果光标在 textarea 元素内,很自然 os.text 就是我们需要的选区内容:

rangedata.text = os.text;并且我们可以通过 os.getbookmark() 方法获取到选区的位置数据,该位置数据可以通过 movetobookmark() 方法设置回去。

getbookmark: retrieves a bookmark (opaque string) that can be used with movetobookmark to return to the same range.

movetobookmark: moves to a bookmark.
我们用 rangedata.bookmark 来记录该位置数据:

rangedata.bookmark = os.getbookmark();下面是最重要的步骤:我们比较 or 与 os 的选区起始位置(使用 object.compareendpoints(stype, orange) 方法比较),如果 or 的起始位置在 os 之前,我们向前移动 os 的起始位置1个字符(使用 object.movestart(sunit [, icount]) 方法移动),一直当 os 的起始位置在 or 之前停止,移动的位置,则是选区的起始位置。

compareendpoints: compares an end point of a textrange object with an end point of another range.

movestart: changes the start position of the range.
for (i = 0; or.compareendpoints('starttostart', os) < 0 && os.movestart("character", -1) !== 0; i ++) {}rangedata.start = i;但由于在 ie 中,textarea 元素中的所有换行符都占 1 个字符,可以通过 alert(textarea.value.length) 查看,故要对上面的代码做部分处理:

for (i = 0; or.compareendpoints('starttostart', os) < 0 && os.movestart("character", -1) !== 0; i ++) {    // why? you can alert(textarea.value.length)    if (textarea.value.charat(i) == 'n') {        i ++;    }}rangedata.start = i;既然得到了选区的起始位置和选区字符串的字符,很自然我们可以计算得到选区的末尾位置:

rangedata.end = rangedata.text.length + rangedata.start;

热门栏目