TextArea中定位光标位置
在项目中,遇到一个场景:希望能在TextArea中输入某条记录中的明细(明细较简单,没有附属信息,只用记录顺序和值即可,譬如用“+”号来作为明细分隔符:1+1.5+2+3.4),如下图所示:
![]()
为了让输入更直观,需要在输入过程中,实时地显示汇总数量和合计;如果用户希望编辑文本中间的某条明细,也可以通过鼠标点击、或者键盘上的上下左右键来定位某个明细,并在页面上提示光标的焦点位置。
最开始,通过windows.event.x、windows.event.y、windows.event.clientX、windows.event.clientY来获取光标位置;在测试过程中发现,鼠标点击的时候可以取到正确的位置,但一旦把鼠标移走,或者用上下左右键移动光标,就无法定位光标的位置了。
1:
2: function getPosition(input)
3: {
4: var rng = event.srcElement.createTextRange();
5: rng.collapse(true);
6: rng.moveToPoint(window.event.clientX, window.event.clientY);
7: rng.moveStart("character", -input.value.length);
8:
9: var a = [];
10: rng.text.replace(/\+/g, function($0) { a.push($0); });
11: document.getElementById("position").innerHTML = "第:" + (a.length + 1) + "条明细";
12: }
windows.event.x/y/clientX/clientY,取得的是事件触发时,鼠标的位置,不是文本框中光标的位置,所以这段代码无法定位文本框中光标的位置。
网上搜了下,找到另外一种实现方式,测试代码如下:
1: <span id="stat">数量:0, 合计:0</span>
2: <span style="width:20px"></span>
3: <span id="position"></span><br />
4: <textarea ID="tbxWeightDetail" style="width:250px" width="250px" runat="server" TextMode="MultiLine"
5: onchange="getPosition(this);calcWeight(this, true);"
6: onkeyup="getPosition(this);calcWeight(this);" onclick="getPosition(this);" onblur="clearPosition(this);"
7: ></textarea>
8:
9: <script>
10: function calcWeight(input, c)
11: {
12: var a = [];
13: input.value.replace(/\d+([\.]\d+){0,1}/g, function($0) { a.push($0); });
14: var sum = eval(a.join("+")) || 0;
15: document.getElementById("stat").innerHTML = "数量:" + a.length + ", 合计:" + sum.toFixed(2);
16: if (c)
17: {
18: input.value = a.join("+");
19: }
20: }
21:
22: calcWeight(document.getElementById("tbxWeightDetail"));
23:
24: function getPosition(input)
25: {
26: var rng = event.srcElement.createTextRange();
27: var length = 0;//设置初始位置
28: input.focus();
29: var scrollPosition = input.scrollTop;//获得滚动条的位置
30: var selectedRange = document.selection.createRange();//创建文档选择对象
31: rng.collapse(true);
32: rng.select();
33: var j = document.selection.createRange();//为新的光标位置创建文档选择对象
34: selectedRange.setEndPoint("StartToStart",j);//在以前的文档选择对象和新的对象之间创建对象
35: var str = selectedRange.text;//获得对象的文本
36: var re = new RegExp("[\\n]","g");
37: str = str.replace(re,"");//过滤
38: length = str.length;//获得长度.也就是光标的位置
39: selectedRange.collapse(false);
40: selectedRange.select();//把光标恢复到以前的位置
41: input.scrollTop = scrollPosition;//把滚动条恢复到以前的位置
42:
43: var a = [];
44: str.replace(/\+/g, function($0) { a.push($0); });
45: document.getElementById("position").innerHTML = "第" + (a.length + 1) + "个明细";
46: }
47:
48: function clearPosition(input)
49: {
50: document.getElementById("position").innerHTML = "";
51: }
52: </script>
TextArea中定位光标位置的更多相关文章
- android中定位光标位置
edittext.setSelection(int); edittext.setText(123);//设置edittext中的内容 edittext.setSelection(123.length( ...
- js获取输入框中当前光标位置并在此位置插入字符串的方法(angularjs+ts)
一半是参照别人代码,一半是自己代码,略笨拙,如果有更好的方法希望分享. 获取当前光标位置的方法 getCaretPosition (obj:any) { //获取输入框中当前光标的位置,obj为此输入 ...
- Linux初识之Centos7中terminal光标位置偏移问题的解决
新安装的centos7打开terminal发现光标位置向右偏移,使用起来影响感官,经查询后找到类似情况并顺利解决问题,特记录解决过程以作参考. 1.未解决时光标向右偏移显示: 2.打开设置(Setti ...
- 设置输入域(input/textarea)中文本光标的位置
以前记录了一篇 将光标定位于输入框最右侧的实现方式 ,实现光标定位在文本的最末.这种需求往往在修改现有的文本.有时可能还需要把光标定位在首位,或者中间某个位置,这就需要实现一个更通用的方法. 这个方法 ...
- shell 字符串中定位字符位置 获取字符位置
linux shell 字符串操作(长度,查找,替换)详解 该博文中描述的如下两个字符串操作, ${string:position} #在$string中, 从位置$position开始提取子串 ${ ...
- JS在可编辑的div中的光标位置插入内容或表情
<input type="button" value="插入字符" onclick="document.getElementById('test ...
- 用JQuery获取输入框中的光标位置
(function ($, undefined) { $.fn.getCursorPosition = function () { var el = $(this).get(0); var pos = ...
- windows.h头文件中改变光标位置的函数——SetConsoleCursorPosition
COORD 具体为 typedef struct COORD{ short X; short Y; } COORD,*PCOORD; 可以用来记录坐标. #include <iostre ...
- 獲取 Textarea 的光標位置(摘自網絡)
在任何编辑器中,获取光标位置都是非常重要的,很多人可能认为较难,其实只要处理好浏览器的兼容,还是比较容易实现的.下面我们一起来看看如何获取到 Textarea 元素中的光标位置.首先,我们用 rang ...
随机推荐
- 学习json-rpc
最近做一个和SmartHome相关的项目,文档不全不说,连个像样的Demo都没,痛苦!!当然,这是题外话.今天来说说项目中主要用到的通讯协议:json-rpc,简单地说,它是以json格式进行的远程调 ...
- 深入理解Android中ViewGroup
文章目录 [隐藏] 一.ViewGroup是什么? 二.ViewGroup这个容器 2.1 添加View的算法 2.1.1 我们先来分析addViewInner方法: 2.1.2 addInArr ...
- 协议系列UDP协议
所述上部TCP虽然该协议提供了一个可靠的传输,但也有一个缺点.发送速度慢.是否有协议它可以以高速传送?这部分是将要讨论UDP协议,它提供了更加快了传输速度.而且在可靠性为代价,这是一个无连接的传输协议 ...
- 中文乱码?不,是 HTML 实体编码!(转)
在 如何用 Nodejs 分析一个简单页面 一文中,我们爬取了博客园首页的 20 篇文章标题,输出部分拼接了一个字符串: var $ = cheerio.load(sres.text); var an ...
- Centos 7 学习加入用户
正在使用 Centos 许多人前使用Ubuntu,因此, useradd 和 adduser 两个命令歧义,于Ubuntu这是在系统上两个命令,于Centos在这同一个命令,adduser 在一个链接 ...
- Hsql中In没有1000的限制
SELECT * FROM user , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...
- Fiddler工具的基本功能(转)
Fiddler是一款用于网页数据分析,抓取的工具,里面集成了对网页强大的功能外,还可以通过设置,使其对手机的数据也可以进行抓取 Fiddler的原理是: 通过在客户端和服务器之间创建一个代理服务器来对 ...
- hdu1796 How many integers can you find
//设置m,Q小于n可以设置如何几号m随机多项整除 //利用已知的容斥原理 //ans = 数是由数的数目整除 - 数为整除的两个数的数的最小公倍数 + 由三个数字... #include<cs ...
- avalonjs1.5 入门教程
迷你MVVM框架 avalonjs1.5 入门教程 avalon经过几年以后,已成为国内一个举足轻重的框架.它提供了多种不同的版本,满足不同人群的需要.比如avalon.js支持IE6等老旧浏览器,让 ...
- IT薪酬
新加坡IT薪酬 2014-06-12 12:51 by 圣殿骑士, 8856 阅读, 37 评论, 收藏, 编辑 很多朋友发邮件或留言问我关于新加坡IT薪酬的问题,由于前段时间比较忙,所以没有及时一一 ...