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