用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 相关文章推荐
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
Aug 27 Javascript
解决jquery的.animate()函数在IE6下的问题
Dec 03 Javascript
jquery 中ajax执行的优先级
Jun 22 Javascript
jQuery实现径向动画菜单效果
Jul 17 Javascript
JS简单生成两个数字之间随机数的方法
Aug 03 Javascript
Javascript 动态改变imput type属性
Nov 01 Javascript
Web前端框架Angular4.0.0 正式版发布
Mar 28 Javascript
基于js中style.width与offsetWidth的区别(详解)
Nov 12 Javascript
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
npm 常用命令详解(小结)
Jan 17 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
Nov 01 Javascript
小程序wx.getUserProfile接口的具体使用
Jun 02 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
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
详解Python编程中time模块的使用
2015/11/20 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
HTML5的语法变化介绍
2013/08/13 HTML / CSS
.net开发工程师面试题
2014/02/25 面试题
高级护理实习生自荐信
2013/09/28 职场文书
急诊科护士自我鉴定
2013/10/14 职场文书
大学生应聘推荐信范文
2013/11/19 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
股份转让协议书范本
2015/01/27 职场文书
新郎结婚保证书
2015/02/26 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
大国崛起日本观后感
2015/06/02 职场文书
感恩父母主题班会
2015/08/12 职场文书