Javascript 插入符号位置没有跟踪?
我想做的是把关键代码放在一个数组中,以后再做一些有趣的事情。因此,我捕获击键,获取插入符号位置并将键代码放入数组中(在MooTools的帮助下): 一般来说,这很有效。但是,在控制台中显示完整数组时,我注意到数组中有一些未定义的值。进一步探究这一点,我发现当快速输入时,插入符号的位置似乎失去了方向,或者反应快/慢。我制作了一个JSFIDLE来演示这一点: 如果在本例中快速键入,您将看到插入符号位置序列,如Javascript 插入符号位置没有跟踪?,javascript,mootools,mootools-events,Javascript,Mootools,Mootools Events,我想做的是把关键代码放在一个数组中,以后再做一些有趣的事情。因此,我捕获击键,获取插入符号位置并将键代码放入数组中(在MooTools的帮助下): 一般来说,这很有效。但是,在控制台中显示完整数组时,我注意到数组中有一些未定义的值。进一步探究这一点,我发现当快速输入时,插入符号的位置似乎失去了方向,或者反应快/慢。我制作了一个JSFIDLE来演示这一点: 如果在本例中快速键入,您将看到插入符号位置序列,如 - 1 - 2 - 3 - 5 - 6 - 6. 但是当打字慢的时候,它是 - 1 -
- 1 - 2 - 3 - 5 - 6 - 6.
但是当打字慢的时候,它是
- 1 - 2 - 3 - 4 - 5 - 6.
当然,现在快速键入的问题是数组中有一个未定义的值,我覆盖了一个数组项。所以结果是不同的
我的问题是,我是否可以让插入符号的位置保持跟踪。我尝试过使用“本机”selectionStart
,但结果是一样的。我还尝试在keydown
事件中捕获插入符号位置,并将其放入keydup
事件中的数组中。没有区别。我想知道使用小停顿(即强制用户输入速度较慢)是否可以解决这个问题,但这感觉像是一种黑客行为,我更喜欢“适当”的解决方案。希望有一个。使用数组而不是对象基本上是在制造混乱
数组索引是不可靠的,如果不小心,可以创建稀疏数组。例如:
var foo = [];
foo[0] = "one!"; // foo.length = 1;
foo[2] = "two!"; // foo.length = 3, foo[1] = undefined
因此,如果您键入太快并跳过返回值,它可能正在这样做。此外,粘贴等可以推动插入符号进一步向下
您可能可以使用一个对象,尽管在所有浏览器中都不能保证键的顺序,尤其是webkit,它倾向于重新排序并将数字键放在对象键循环的顶部。。。但是如果你在键前面加上前缀,比如“pos”+caretIndex,你应该得到FIFO
一种解决提取实际代码而不使用未定义代码的方法是通过Array.filter
例如
对于对象,您只需执行以下操作:
console.log(Object.values(foo));
通过使用数组而不是对象,基本上是在制造混乱
数组索引是不可靠的,如果不小心,可以创建稀疏数组。例如:
var foo = [];
foo[0] = "one!"; // foo.length = 1;
foo[2] = "two!"; // foo.length = 3, foo[1] = undefined
因此,如果您键入太快并跳过返回值,它可能正在这样做。此外,粘贴等可以推动插入符号进一步向下
您可能可以使用一个对象,尽管在所有浏览器中都不能保证键的顺序,尤其是webkit,它倾向于重新排序并将数字键放在对象键循环的顶部。。。但是如果你在键前面加上前缀,比如“pos”+caretIndex,你应该得到FIFO
一种解决提取实际代码而不使用未定义代码的方法是通过Array.filter
例如
对于对象,您只需执行以下操作:
console.log(Object.values(foo));
经过更多测试后,这似乎是keyup
特有的行为。当我使用keydown
时,我确实得到了一个一致的序列:
一个缺点是keydown
在您执行我正在执行的“值收集”时落后于keydup
,但在我的设置中,这只是一个小问题
行为上的差异对我来说似乎很奇怪:当你一次按四个键时,keyup
为所有键显示相同的插入符号位置,而keydown
显示四个独立的插入符号位置。这看起来很奇怪,因为你一次按下它们,同时也一次按下它们,所以插入符号“读数”应该是相同的。经过一些测试后,这似乎是一种特定于键控的行为。当我使用keydown
时,我确实得到了一个一致的序列:
一个缺点是keydown
在您执行我正在执行的“值收集”时落后于keydup
,但在我的设置中,这只是一个小问题
行为上的差异对我来说似乎很奇怪:当你一次按四个键时,keyup
为所有键显示相同的插入符号位置,而keydown
显示四个独立的插入符号位置。这看起来很奇怪,因为你一次按下它们,同时也一次按下它们,所以插入符号“读数”应该是相同的。转到JSFIDLE并摆弄它:
a) 按下“q”,然后按下“w”,然后释放“q”,然后释放“w”(足够快以避免自动恢复)。当您用多个手指快速键入时,这种序列会经常发生:)
b) 按住任意键足够长的时间,以使自动回复生效
差别显而易见
基本上,keyUp
在释放物理密钥时触发,但是
- 在释放前一个键之前,可以按下另一个键
- 自动重放时调用
keyDown
,而keydup
不调用
由于carret位置和任何文本区域更新都与keyDown
保持同步,因此在监视keydup
时,您将错过中间步骤
在案例(a)中,keyUp
处理程序将carret pos从0跳到2,因为在释放第一个键之前已经键入了两个字符,因此释放了“q”。“w”的释放不会改变carret的位置,因此处理程序最终将q和w存储在位置2
在案例(b)中,处理程序完全错过重复,并且只存储密钥的最后一个实例
总之,使用KeyUp
永远不会达到预期的意义
keyDown
可以,但就个人而言,我宁愿挂起changed
事件
我认为,检测机器人填充该字段(毕竟,合法用户可能也想粘贴密码)同样可靠,而且你不必费心使用诸如backspace之类的控制键或任何其他清除输入的非键盘方式
你可以用<