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

网页特效 获取textarea 元素的光标位置代码

<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312" />
<title>demo : textarea 元素的光标位置</title>
<style>
#result {
    font-size:18px;
    line-height:25px;
    padding-left:20px;
}
</style>
</head>

<body>

<h1>textarea 元素的光标位置</h1>
<ul>
 <li>获取 textarea 元素当前的光标位置</li>
    <li>设置回原先的 textarea 元素的光标位置</li>
    <li>在 textarea 元素的光标位置插入文本</li>
</ul>

<form action="#">
    <textarea id="test" rows="8" cols="50"></textarea>
    <p>
        <input type="button" id="get" value="get cursor position"/>
        <input type="button" id="set" value="set cursor position"/>
        <input type="button" id="add" value="add text after cursor position"/>
    </p>
</form>

<h2>textarea range:</h2>
<div id="result"></div>

<script type="text/javascript">

/**
 * cursorposition object
 *
 * created by blank zheng on 2010/11/12.
 * copyright (c) 2010 planabc.net. all rights reserved.
 *
 * the copyrights embodied in the content of this file are licensed under the bsd (revised) open source license.
 */
 
var cursorposition = {
 get: function (textarea) {
  var rangedata = {text: "", start: 0, end: 0 };
 
  if (textarea.setselectionrange) { // w3c
   textarea.focus();
   rangedata.start= textarea.selectionstart;
   rangedata.end = textarea.selectionend;
   rangedata.text = (rangedata.start != rangedata.end) ? textarea.value.substring(rangedata.start, rangedata.end): "";
  } else if (document.selection) { // ie
   textarea.focus();
   var i,
    os = document.selection.createrange(),
    // don't: or = textarea.createtextrange()
    or = document.body.createtextrange();
   or.movetoelementtext(textarea);
  
   rangedata.text = os.text;
   rangedata.bookmark = os.getbookmark();
  
   // object.movestart(sunit [, icount])
   // return value: integer that returns the number of units moved.
   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;
  
   if(!rangedata.text) {
   
   }
  }
 
  return rangedata;
 },
 
 set: function (textarea, rangedata) {
  var or;
  if(!rangedata) {
   alert("you must get cursor position first.")
  }
  textarea.focus();
  if (textarea.setselectionrange) { // w3c
   textarea.setselectionrange(rangedata.start, rangedata.end);
  } else if (textarea.createtextrange) { // ie
   or = textarea.createtextrange();
  
   /*// fixbug : ues movetobookmark()
   // in ie, if cursor position at the end of textarea, the setcursorposition function don't work
   if(textarea.value.length === rangedata.start) {
    or.collaps教程e(false)
    or.select();
   } else {
    or.movetobookmark(rangedata.bookmark);
    or.select();
   }*/
   or.movestart('character', rangedata.start);
   or.moveend('character', rangedata.end - textarea.value.length);
   or.select();
  }
 },

add: function (textarea, rangedata, text) {
  var ovalue, nvalue, or, sr, nstart, nend, st;
  this.set(textarea, rangedata);
 
  if (textarea.setselectionrange) { // w3c
   ovalue = textarea.value;
   nvalue = ovalue.substring(0, rangedata.start) + text + ovalue.substring(rangedata.end);
   nstart = nend = rangedata.start + text.length;
   st = textarea.scrolltop;
   textarea.value = nvalue;
   // fixbug:
   // after textarea.values = nvalue, scrolltop value to 0
   if(textarea.scrolltop != st) {
    textarea.scrolltop = st;
   }
   textarea.setselectionrange(nstart, nend);
  } else if (textarea.createtextrange) { // ie
   sr = document.selection.createrange();
   sr.text = text;
   sr.setendpoint('starttoend', sr);
   sr.select();
  }
 }
}

var tx=document.getelementbyid("test"),
 re=document.getelementbyid("result"),
 pos;

document.getelementbyid("get").onclick = function(){
 //alert(tx.value.length);
 pos = cursorposition.get(tx);
 re.innerhtml=("<strong>range :</strong> (" + pos.start + ", " + pos.end + ")<br /><strong>text :</strong> " + (!pos.text ? '//--': pos.text));
}

document.getelementbyid("set").onclick = function(){
 cursorposition.set(tx, pos);
}

document.getelementbyid("add").onclick = function(){
 cursorposition.add(tx, pos, input = prompt("你想插入替换的文本:",""));
}
</script>

</body>
</html>

首先,我们用 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;

时间: 2024-08-02 16:55:11

javascript 获取Textarea 元素的光标位置代码的相关文章

javascript 获取Textarea 元素的光标位置代码(1/2)

<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=gb2312" /> <title>demo : textarea 元素的光标位置</title> <style>

用javascript获取textarea中的光标位置_javascript技巧

对于写javascript写网页编辑器的人来说,获取textarea中的光标位置是一个非常重要的问题,而往往很多人在这个地方不知所措,找不到好的办法.昨天我在网上找到了一段javascript代码,本来不想把原版放在这里的,就是因为太精彩了,怕我给改坏了,所以还是原版放在这里吧. var start=0;     var end=0;     function add(){                var textBox = document.getElementById("ta"

用Javascript获取页面元素的具体位置_javascript技巧

制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置. 下面的教程总结了Javascript在网页定位方面的相关知识. 一.网页的大小和浏览器窗口的大小 首先,要明确两个基本概念. 一张网页的全部面积,就是它的大小.通常情况下,网页的大小由内容和CSS样式表决定. 浏览器窗口的大小,则是指在浏览器窗口中看到的那部分网页面积,又叫做viewport(视口). 很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的.如果不能全部显示,

如何用Javascript获得TextArea中的光标位置

javascript|光标 小弟最近在写一个在线编辑器,UBB版的,由于没有使用弹出窗口,所以,在添加代码的时候,只能添在TextArea的最后面,无法在光标之前插入,于是在网上疯狂的找资料,工夫不负有心人,终于被我找到了如何获得TextArea中的位置,但是如果TextArea中有很多内容的时候,会显得很闪烁.其代码如下. function getPos(obj) { obj.focus(); var workRange=document.selection.createRange(); ob

JavaScript 获取页面元素的offset值代码

js获取方法.  代码如下 复制代码 document.getElementById("divFloat").style.top=document.getElementById("Button").offsetLeft+25; 用IETester和FireFox再测试下,IE6+下都可以,如以前一样,写出的纯js的方法无情地被FireFox鄙视了,获取的值不正确. 网上再查了下,发现应该这样写,通过循环,层层向上计算,最后得到准确的offset值. js获取网页控件

javascript 获取模态窗口的滚动位置代码_javascript技巧

实验了一下午,到现在终于解决的了模态窗口的滚动位置获取办法,现在来分享一下, 其实很简单,给你的弹出模态窗口的div块设置一个id, 在js中通过 document.getElementById('divID').scrollLeft 这样获取的是向右滚动的值 同理,scrollTop 就是向下滚动的值, 其实很简单,那就说到这里

用Javascript 获取页面元素的位置的代码_javascript技巧

下面的教程总结了Javascript在网页定位方面的相关知识. 一.网页的绝对大小和相对大小 首先,要明确两个基本概念. 一张网页的全部面积,就是它的绝对大小.通常情况下,网页的绝对大小由内容和CSS样式表决定. 网页的相对大小则是指在浏览器窗口中看到的那部分网页,也就是浏览器窗口的大小,又叫做viewport(视口). 下图中央的方框就代表浏览器窗口,每次只能显示一部分网页. (图一 网页的绝对大小和相对大小) 很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的

JavaScript获取指定元素位置的方法

 本文实例讲述了JavaScript获取指定元素位置的方法.分享给大家供大家参考.具体如下: 代码如下: function showpane() { var self = document.getElementById("eID"); var left = self.getBoundingClientRect().left + document.documentElement.scrollLeft; var top = self.getBoundingClientRect().top

JavaScript获取指定元素位置的方法_javascript技巧

本文实例讲述了JavaScript获取指定元素位置的方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: function showpane() {   var self = document.getElementById("eID");   var left = self.getBoundingClientRect().left + document.documentElement.scrollLeft;   var top = self.getBoundingClientR