2

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

var keyArray = [];
$('form').addEvent('keyup', function(event) {
    var pos = document.activeElement.getCaretPosition();

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

一般来说,这很好用。undefined但是,在控制台中显示完整数组时,我注意到数组中有一些值。进一步探索这一点,我发现当快速打字时,插入符号的位置似乎失去了轨道,或者反应快/慢。我制作了一个 jsfiddle 来证明这一点:http: //jsfiddle.net/HQVR8/1/

如果您在此示例中快速键入,您将看到一个插入符号位置序列,如

- 1 - 2 - 3 - 5 - 6 - 6.

但是打字慢的时候

- 1 - 2 - 3 - 4 - 5 - 6. 

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

我的问题是我是否可以以某种方式让插入符号位置保持跟踪。我尝试过使用“本机” selectionStart,但结果是一样的。我还尝试在事件中捕获插入符号位置keydown并将其放入事件中的数组中keyup。没有不同。我想知道是否使用小暂停(即强制用户输入速度较慢)可以解决它,但这感觉就像一个黑客,我更喜欢一个“适当的”解决方案。希望有一个。

4

3 回答 3

0

您基本上是通过使用数组而不是对象来制造混乱。

数组索引是狡猾的,sparse arrays如果你不小心就可以创建。例如:

var foo = [];
foo[0] = "one!"; // foo.length = 1;
foo[2] = "two!"; // foo.length = 3, foo[1] = undefined

所以如果你输入得太快而跳过返回值,它可能就是这样做的。此外,粘贴等可以将插入符号进一步向下推......

您可能可以使用一个对象,尽管在所有浏览器中都不能保证键的顺序与键的顺序 - 特别是 webkit,他们倾向于重新排序并将数字键放在对象键循环的顶部......但是如果您为键添加前缀像 "pos" + caretIndex,你应该得到 FIFO

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

例如。

retArray = Array.filter(retArray, function(el) {
    return el !== undefined;
});

有了一个对象,你可以这样做:

console.log(Object.values(foo));
于 2012-05-09T13:04:53.807 回答
0

经过更多测试后,它似乎是特定于keyup. 当我使用时,keydown确实得到了一致的序列:http: //jsfiddle.net/HQVR8/3/

一个缺点是,当你在做我正在做的“价值收集”时,keydown它落后了一步,但在我的环境中,这只是一个小问题。keyup

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

于 2012-05-09T13:43:55.723 回答
0

去 JSfiddle 并摆弄这个:

a) 按下“q”,然后按下“w”,然后释放“q”,然后释放“w”(足够快以避免自动重复)。当您用一个以上的手指“快速”键入时,这种顺序经常发生:)。

b) 将任何键按下足够长的时间,以便自动重复启动。

差异显而易见

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

  • 在释放前一个键之前可以按下另一个键
  • keyDown在自动重复的情况下被调用,而keyUp不是

由于 carret 位置和任何文本区域的更新保持同步keyDown,因此您在监视时只会错过中间步骤keyUp

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

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

作为结论,使用KeyUp永远不会达到预期的含义。

keyDown可以,但就我个人而言,我宁愿钩住这个changed事件。

我认为检测填充该字段的机器人同样可靠(毕竟,合法用户也可能想要粘贴密码),而且您不必费心使用退格键或任何其他非键盘手段等控制键清除输入。

keyUp只要您不期望重建确切的输入,您就可以将其用作额外的偏执检查。例如,您可以简单地检查释放的键是否与当前光标位置的字符匹配。但坦率地说,我不确定这是否值得。

于 2013-12-29T23:30:44.620 回答