用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 相关文章推荐
js正确获取元素样式详解
Aug 07 Javascript
js 文本滚动效果的实例代码
Aug 17 Javascript
鼠标拖动实现DIV排序示例代码
Oct 14 Javascript
JavaScript对象的property属性详解
Apr 01 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
Oct 30 Javascript
js格式化时间小结
Nov 03 Javascript
jQuery中:only-child选择器用法实例
Jan 03 Javascript
浅谈JavaScript的push(),pop(),concat()方法
Jun 03 Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
Jul 05 Javascript
layui使用label标签的方法
Sep 14 Javascript
解决vue无法侦听数组及对象属性的变化问题
Jul 17 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
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
php记录日志的实现代码
2011/08/08 PHP
PHP内核探索之变量
2015/12/22 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
原生js实现验证码功能
2017/03/16 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
大四学生毕业自荐信
2013/11/07 职场文书
客户表扬信范文
2014/01/10 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
介绍信格式样本
2015/05/05 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书