用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在网页中实现分隔条功能的代码
Aug 09 Javascript
JavaScript 判断浏览器是否支持SVG的代码
Mar 21 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
jquery实现仿新浪微博评论滚动效果
Aug 06 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
Angular 输入框实现自定义验证功能
Feb 19 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
Jul 15 Javascript
重新认识vue之事件阻止冒泡的实现
Aug 02 Javascript
vue相关配置文件详解及多环境配置详细步骤
May 19 Javascript
js实现小球在页面规定的区域运动
Jun 16 Javascript
vue data变量相互赋值后被实时同步的解决步骤
Aug 05 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
Oct 30 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
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
javascript事件模型代码
2007/07/01 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
PHP开发的一般流程
2013/08/13 面试题
介绍一下gcc特性
2012/01/20 面试题
经贸日语毕业生自荐信
2013/11/03 职场文书
会计助理的岗位职责
2013/11/29 职场文书
优秀研究生自我鉴定
2013/12/04 职场文书
初级党校心得体会
2014/09/11 职场文书
保研推荐信范文
2015/03/25 职场文书
2015年技术员工作总结
2015/04/10 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫