Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 插入符号位置没有跟踪?_Javascript_Mootools_Mootools Events - Fatal编程技术网

Javascript 插入符号位置没有跟踪?

Javascript 插入符号位置没有跟踪?,javascript,mootools,mootools-events,Javascript,Mootools,Mootools Events,我想做的是把关键代码放在一个数组中,以后再做一些有趣的事情。因此,我捕获击键,获取插入符号位置并将键代码放入数组中(在MooTools的帮助下): 一般来说,这很有效。但是,在控制台中显示完整数组时,我注意到数组中有一些未定义的值。进一步探究这一点,我发现当快速输入时,插入符号的位置似乎失去了方向,或者反应快/慢。我制作了一个JSFIDLE来演示这一点: 如果在本例中快速键入,您将看到插入符号位置序列,如 - 1 - 2 - 3 - 5 - 6 - 6. 但是当打字慢的时候,它是 - 1 -

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

一般来说,这很有效。但是,在控制台中显示完整数组时,我注意到数组中有一些未定义的值。进一步探究这一点,我发现当快速输入时,插入符号的位置似乎失去了方向,或者反应快/慢。我制作了一个JSFIDLE来演示这一点:

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

- 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之类的控制键或任何其他清除输入的非键盘方式

你可以用<