用javascript获取textarea中的光标位置


Posted in Javascript onMay 06, 2008

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

var start=0;
    var end=0;
    function add(){       
        var textBox = document.getElementById("ta");
        var pre = textBox.value.substr(0, start);
        var post = textBox.value.substr(end);
        textBox.value = pre + document.getElementById("inputtext").value + post;
    }
    function savePos(textBox){
        //如果是Firefox(1.5)的话,方法很简单
        if(typeof(textBox.selectionStart) == "number"){
            start = textBox.selectionStart;
            end = textBox.selectionEnd;
        }
        //下面是IE(6.0)的方法,麻烦得很,还要计算上'\n'
        else if(document.selection){
            var range = document.selection.createRange();
            if(range.parentElement().id == textBox.id){
                // create a selection of the whole textarea
                var range_all = document.body.createTextRange();
                range_all.moveToElementText(textBox);
                //两个range,一个是已经选择的text(range),一个是整个textarea(range_all)
                //range_all.compareEndPoints()比较两个端点,如果range_all比range更往左(further to the left),则                //返回小于0的值,则range_all往右移一点,直到两个range的start相同。
                // calculate selection start point by moving beginning of range_all to beginning of range
                for (start=0; range_all.compareEndPoints("StartToStart", range) < 0; start++)
                    range_all.moveStart('character', 1);
                // get number of line breaks from textarea start to selection start and add them to start
                // 计算一下\n
                for (var i = 0; i <= start; i ++){
                    if (textBox.value.charAt(i) == '\n')
                        start++;
                }
                // create a selection of the whole textarea
                 var range_all = document.body.createTextRange();
                 range_all.moveToElementText(textBox);
                 // calculate selection end point by moving beginning of range_all to end of range
                 for (end = 0; range_all.compareEndPoints('StartToEnd', range) < 0; end ++)
                     range_all.moveStart('character', 1);
                     // get number of line breaks from textarea start to selection end and add them to end
                     for (var i = 0; i <= end; i ++){
                         if (textBox.value.charAt(i) == '\n')
                             end ++;
                     }
                }
            }
        document.getElementById("start").value = start;
        document.getElementById("end").value = end;
    }
下面是在页面中调用js代码的方法:

<form action="a.cgi">
<table border="1" cellspacing="0" cellpadding="0">
    <tr>
        <td>start: <input type="text" id="start" size="3"/></td>
        <td>end: <input type="text" id="end" size="3"/></td>
    </tr>
    <tr>
        <td colspan="2">
            <textarea id="ta" onKeydown="savePos(this)"
                              onKeyup="savePos(this)"
                              onmousedown="savePos(this)"
                              onmouseup="savePos(this)"
                              onfocus="savePos(this)"
                              rows="14" cols="50"></textarea>
        </td>
    </tr>
    <tr>
        <td><input type="text" id="inputtext" /></td>
        <td><input type="button" onClick="add()" value="Add Text"/></td>
    </tr>
</table>
</form>
此代码的原文是:http://blog.csdn.net/liujin4049/archive/2006/09/19/1244065.aspx,在此谢过!

这段js代码同时支持IE和Firefox,甚是精彩,可见此人js功力深厚啊,呵呵。

Btw:听说Firefox现在的市场占有率已经达到17%了,而IE8也快出来了,浏览器之间又会掀起一场你死我活的争斗,而这种争斗可以使浏览器的解析标准会越来越规范,我们写代码也会越来越省事,这实在是一件值得高兴的事。

Javascript 相关文章推荐
MSN消息提示类
Sep 05 Javascript
js AspxButton的客户端操作
Jun 26 Javascript
jQuery 跨域访问问题解决方法
Dec 02 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
Nov 24 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
angularJS 指令封装回到顶部示例详解
Jan 22 Javascript
原生JS+Canvas实现五子棋游戏实例
Jun 19 Javascript
vue filters的使用详解
Jun 11 Javascript
Vue2.0 $set()的正确使用详解
Jul 28 Javascript
详解vue 组件注册
Nov 20 Vue.js
用js实现下载远程文件并保存在本地的脚本
May 06 #Javascript
来自chinaz的ajax获取评论代码
May 03 #Javascript
定义select的边框颜色
Apr 28 #Javascript
JavaScript对象模型-执行模型
Apr 28 #Javascript
JavaScript面象对象设计
Apr 28 #Javascript
JS event使用方法详解
Apr 28 #Javascript
ext for eclipse插件安装方法
Apr 27 #Javascript
You might like
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
制作特殊字的脚本
2006/06/26 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
JQuery球队选择实例
2015/05/18 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue实例的选项总结
2020/06/09 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
详解supervisor使用教程
2017/11/21 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python如何使用函数做字典的值
2019/11/30 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
实习教师自我鉴定
2013/12/12 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
社区元宵节活动总结
2015/02/06 职场文书
酒店员工辞职信范文
2015/02/28 职场文书