用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在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 Javascript
手机号码,密码正则验证
Sep 04 Javascript
JS小游戏之极速快跑源码详解
Sep 25 Javascript
AngularJS 中的事件详解
Jul 28 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
Sep 24 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
Oct 28 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
JQuery特殊效果和链式调用操作示例
May 13 jQuery
解决Vue调用springboot接口403跨域问题
Sep 02 Javascript
vue实现评价星星功能
Jun 30 Javascript
在Uni中使用Vue的EventBus总线机制操作
Jul 31 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/11/04 PHP
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
php多文件上传实现代码
2014/02/20 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
js判断样式className同时增加class或删除class
2013/01/30 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
js实现登录与注册界面
2017/11/01 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
python实现通过shelve修改对象实例
2014/09/26 Python
Python中运行并行任务技巧
2015/02/26 Python
基python实现多线程网页爬虫
2015/09/06 Python
深入了解Python数据类型之列表
2016/06/24 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
python模块内置属性概念及实例
2021/02/18 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
公益活动策划方案
2014/01/09 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
西门豹教学反思
2014/02/04 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书