我想做的是将键代码放入数组中,以便以后做一些有趣的事情。因此,我捕获了击键,获得了插入符号的位置,并将键代码放入数组中(在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值,并且覆盖了一个数组项。因此结果是不同的。

我的问题是,是否可以让插入符号的位置保持跟踪。我尝试使用'native'selectionStart代替,但是结果是相同的。我还尝试捕获keydown事件中的插入符号位置,并将其放置在keyup事件中的数组中。没有不同。我想知道是否只需稍作停顿(即强迫用户键入较慢的声音)就可以解决问题,但这感觉就像是骇客,我更喜欢“适当的”解决方案。希望有一个。

最佳答案

您基本上是通过使用数组而不是对象来弄乱的。

数组索引比较狡猾,如果不小心,可以创建sparse arrays。例如:

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


因此,如果您输入得太快而跳过了返回值,则可能就是这样做。同样,粘贴等也可以将插入符号进一步向下推...

您可能可以使用一个对象,尽管在所有浏览器中都无法保证输入键与输出键的顺序,尤其是Webkit,Webkit倾向于重新排序并将数字键放在对象键循环的顶部...但是如果您给键添加前缀像“ pos” + caretIndex,您应该获取FIFO

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

例如。

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


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

console.log(Object.values(foo));

关于javascript - 插入符位置无法跟踪?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10512272/

10-09 15:17