首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caret位置没有记录吗?

Caret位置没有记录吗?
EN

Stack Overflow用户
提问于 2012-05-09 16:15:17
回答 3查看 447关注 0票数 2

我想做的是把关键代码放在一个数组中,以便以后做一些有趣的事情。因此,我捕获了击键,获得了插入符号的位置,并将关键代码放入数组中(在MooTools的帮助下):

代码语言:javascript
复制
var keyArray = [];
$('form').addEvent('keyup', function(event) {
    var pos = document.activeElement.getCaretPosition();

    keyArray[pos] = event.code;
});

一般来说,这很有效。但是,当在控制台中显示完整的数组时,我注意到数组中的一些undefined值。进一步研究,我发现当快速输入时,插入符号的位置似乎失去了踪迹,或者响应较快/较慢。我制作了一个jsfiddle来演示这一点:http://jsfiddle.net/HQVR8/1/

如果在本例中快速键入,您将看到如下所示的插入符号位置序列

代码语言:javascript
复制
- 1 - 2 - 3 - 5 - 6 - 6.

但是当打字慢的时候,它是

代码语言:javascript
复制
- 1 - 2 - 3 - 4 - 5 - 6. 

当然,现在快速输入的问题是我的数组中有一个undefined值,并且我覆盖了一个数组项。所以结果是不同的。

我的问题是,我是否能以某种方式让插入符号的位置保持跟踪。我尝试使用‘原生’selectionStart代替,但结果是相同的。我还尝试捕获keydown事件中的插入符号位置,并将其放入keyup事件的数组中。没什么区别。我想知道如果使用小停顿(即。强迫用户打字慢一点)可能会解决这个问题,但这感觉像是一个黑客行为,我更喜欢一个“适当”的解决方案。希望有一个。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-09 21:43:56

经过更多的测试,这似乎是keyup特有的行为。当我使用keydown时,我得到了一个一致的序列:http://jsfiddle.net/HQVR8/3/

一个缺点是,当你在做我正在做的“值收集”时,keydownkeyup晚了一步,但在我的设置中,这只是一个小问题。

行为上的差异对我来说似乎很奇怪:当你一次按四个键时,keyup会为它们显示相同的插入符号位置,而keydown则显示四个独立的插入符号位置。这看起来很奇怪,因为你一次按下它们,但同时也会按下它们,所以插入符号“读数”应该是相同的。

票数 0
EN

Stack Overflow用户

发布于 2012-05-09 21:04:54

通过使用数组而不是对象,您基本上是在搞乱。

数组索引是不可靠的,如果您不小心,可能会创建sparse arrays。例如:

代码语言:javascript
复制
var foo = [];
foo[0] = "one!"; // foo.length = 1;
foo[2] = "two!"; // foo.length = 3, foo[1] = undefined

所以,如果你输入得太快而跳过返回值,它很可能就是这么做的。此外,粘贴etc可以进一步压低插入符号...

你可能可以使用一个对象,尽管不能保证所有浏览器中的键和键的顺序--特别是webkit,它倾向于重新排序并将数字键放在对象键循环的顶部……但是如果你给键加上"pos“+ caretIndex这样的前缀,你应该得到先进先出

解决你需要提取没有未定义代码的实际代码的一种方法是通过Array.filter。

例如:

代码语言:javascript
复制
retArray = Array.filter(retArray, function(el) {
    return el !== undefined;
});

使用对象,您只需执行以下操作:

代码语言:javascript
复制
console.log(Object.values(foo));
票数 0
EN

Stack Overflow用户

发布于 2013-12-30 07:30:45

转到JSfiddle,摆弄一下这个:

a)按下'q',然后按下'w',然后松开'q',然后松开'w‘(速度快到足以避免自动重复)。当你用多个手指“快速”输入时,这种序列经常会发生:)。

b)让任何按键按下足够长的时间,以便自动重复功能生效。

区别是显而易见的。

基本上,keyUp在释放物理键时触发,但是

在自动重复的情况下,可以在前一个键released

  • keyDown is
  • 之前按下另一个键,而keyUp不是

由于carret位置和任何文本区域更新都与keyDown保持同步,因此在监控keyUp时,您将简单地错过中间步骤。

在情况(a)中,keyUp处理程序看到carret pos在'q‘被释放时从0跳到2,因为在释放第一个键之前已经键入了两个字符。'w‘的释放不会改变carret的位置,因此处理程序最终将q和w都存储在位置2。

在情况(b)中,处理程序完全遗漏了重复操作,并且只存储了键的最后一个实例。

总而言之,使用KeyUp永远不会达到预期的目的。

keyDown可以,但就个人而言,我更喜欢挂接changed事件。

我认为检测到机器人填充字段也同样可靠(毕竟,合法用户也可能希望粘贴密码),而且您不必费心使用诸如退格键或任何其他非键盘方式来清除输入。

您可以使用keyUp作为额外的偏执检查,只要您不希望重新构造确切的输入。例如,您可以简单地检查释放的键是否与当前光标位置处的字符匹配。但坦率地说,我不确定是否值得这么麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10512272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档