用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节点遍历next与nextAll方法使用示例
Jul 22 Javascript
自编jQuery插件实现模拟alert和confirm
Sep 01 Javascript
引用其它js时如何同时处理多个window.onload事件
Sep 02 Javascript
javascript显示上周、上个月日期的处理方法
Feb 03 Javascript
AngularJS入门教程之双向绑定详解
Aug 18 Javascript
vue实现简单实时汇率计算功能
Jan 15 Javascript
vue v-model表单控件绑定详解
May 17 Javascript
BootStrap入门学习第一篇
Aug 28 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
Sep 06 jQuery
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
vue+Element-ui实现分页效果实例代码详解
Dec 10 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
Javascript Object.extend
2010/05/18 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
js opener的使用详解
2014/01/11 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
Django 使用logging打印日志的实例
2018/04/28 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
优秀民警事迹材料
2014/01/29 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
法定授权委托证明书
2015/06/18 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
Python实现生活常识解答机器人
2021/06/28 Python