博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TextArea中定位光标位置
阅读量:5128 次
发布时间:2019-06-13

本文共 2412 字,大约阅读时间需要 8 分钟。

原文:

    在项目中,遇到一个场景:希望能在TextArea中输入某条记录中的明细(明细较简单,没有附属信息,只用记录顺序和值即可,譬如用“+”号来作为明细分隔符:1+1.5+2+3.4),如下图所示:

    为了让输入更直观,需要在输入过程中,实时地显示汇总数量和合计;如果用户希望编辑文本中间的某条明细,也可以通过鼠标点击、或者键盘上的上下左右键来定位某个明细,并在页面上提示光标的焦点位置。

 

    最开始,通过windows.event.x、windows.event.y、windows.event.clientX、windows.event.clientY来获取光标位置;在测试过程中发现,鼠标点击的时候可以取到正确的位置,但一旦把鼠标移走,或者用上下左右键移动光标,就无法定位光标的位置了。

 
 
 
 
 
 
 
 
 
 
 
 

    windows.event.x/y/clientX/clientY,取得的是事件触发时,鼠标的位置,不是文本框中光标的位置,所以这段代码无法定位文本框中光标的位置。

 

网上搜了下,找到另外一种实现方式,测试代码如下:

1: 数量:0, 合计:0
2: 
3: 
4: 
5:     οnchange="getPosition(this);calcWeight(this, true);"
6:     οnkeyup="getPosition(this);calcWeight(this);" οnclick="getPosition(this);" οnblur="clearPosition(this);"
7:     >
8: 
9: 
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: 
posted on
2014-08-21 13:07 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/3926948.html

你可能感兴趣的文章
HDU-4647 Another Graph Game 贪心,博弈
查看>>
easyui datagrid.gridFilter搜索插件
查看>>
Unity GameObject 对象池
查看>>
RepotService添加空格符
查看>>
IP Address Configuration on Linux (RHEL 5.4)
查看>>
JS浏览器检测判断
查看>>
使用linux内核hrtimer高精度定时器实现GPIO口模拟PWM,【原创】
查看>>
Xshell配色方案啊【学习笔记】
查看>>
10秒钟执行一次计划任务
查看>>
Java魔法堂:类加载机制入了个门
查看>>
缺货流程
查看>>
去除inline-block元素间间距的N种方法
查看>>
hdu4965矩阵快速幂
查看>>
Tensorflow 学习三 可视化
查看>>
Artifact contains illegal characters的解决
查看>>
@@ERROR和@@ROWCOUNT的用法
查看>>
Train Problem II(卡特兰数+大数乘除)
查看>>
C# - 泛型委托
查看>>
咏南开发框架调用存储过程演示
查看>>
Jackson2.1.4 序列化对象时,过滤null的属性 empty的属性 default的属性
查看>>