用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 相关文章推荐
JavaScript语句可以不以;结尾的烦恼
Mar 08 Javascript
用Javascript同时提交多个Web表单的方法
Dec 26 Javascript
JavaScript中window、doucment、body的解释
Aug 14 Javascript
基于jquery的simpleValidate简易验证插件
Jan 31 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
Mar 05 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
AngularJS入门教程之静态模板详解
Aug 18 Javascript
基于JS+Canves实现点击按钮水波纹效果
Sep 15 Javascript
webpack 1.x升级过程中的踩坑总结大全
Aug 09 Javascript
JavaScript实现图片切换效果
Aug 12 Javascript
jquery制作的移动端购物车效果完整示例
Feb 24 jQuery
vue 实现把路由单独分离出来
Aug 13 Javascript
用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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
php下过滤HTML代码的函数
2007/12/10 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
php实现的SESSION类
2014/12/02 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
教你学会使用Python正则表达式
2017/09/07 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
关于Keras Dense层整理
2020/05/21 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
高中生学习总结的自我评价范文
2013/10/13 职场文书
创业计划书如何吸引他人眼球
2014/01/10 职场文书
《春天来了》教学反思
2014/04/07 职场文书
小学学校评估方案
2014/06/08 职场文书
让子弹飞观后感
2015/06/11 职场文书
暑假生活随笔
2015/08/15 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python