按下的时间是几点?
$(captureInput).keydown(function(event){
startDOWNPress = (new Date()).getTime();
.
. //Codigo no util para el ejemplo
.
$(captureInput).keypress(function(event){
startPressUP = (new Date()).getTime();
.
.//Codigo no util para el ejemplo
.
$(captureInput).keyup(function(event){
startUPDOWN= (new Date()).getTime();
我正在做的是获取拧紧时间,因为我获得了从拧紧(keyDown
)到最初抬起(keyup
)的时间。
高光时刻怎么做?
增强时间是从发布开始到发布结束。
编辑:
按压时间:从检测到某个键被按下(KeyDown)到检测到不再被按下(KeyUp)的时间。
高亮时间:从最后一次认为某个键被输入 (KeyPress) 到检测到它不再被按下 (KeyUp) 的时间。
仅使用软件无法检测到这些时间。
键盘是将线性幅度(键的高度)转换为二进制幅度(键的电路打开或关闭)的设备。
按键有一个力度阈值,低于该阈值时未检测到击键,高于该阈值时检测不到击键。“专业”(阅读:昂贵)键盘将此信息作为其规格的一部分发布,并以克压力(或牛顿厘米)为单位进行测量。一个典型的按键在 30 到 80 克的压力下工作。
当您开始按键时,您施加零压力。过了一定的门槛,钥匙开始它的旅程,它的高度开始下降。随着毫秒的流逝,您施加更大的力,钥匙通过检测阈值,电路关闭,信号被发送到计算机。但是键会继续它的旅程,直到它物理地击中键盘的底部。
(反之亦然:当您释放压力时,按键再次返回超过阈值,电路打开,按键继续移动,直到您最终施加零压力并抬起手指)
我将从https://deskthority.net/wiki/Force复制粘贴一些图形:
按键是时间(持续时间)和空间(按键高度)上的连续事件,但计算机对于按键是否被按下只有二进制视图。
在图表中,您可以看到当施加更多压力时按键的高度,黑色和白色点确定计算机将按键解释为被按下的阈值。
当该状态发生变化
keydown
时,软件会相应地采取行动并相应地触发事件keyup
。这些事件keypress
是不同的,因为它们依赖于诸如字符映射和组合键之类的概念。如果问题是...
...或相反亦然...
...那么答案是:你不能。
(阅读评论后更新)
有人可能想知道...
因为
keydown
andkeyup
包含与键相关的信息,而keypress
包含与字符相关的信息。例如:当我按下我右手的小指键,
keydown
并且被解雇时,keyup
报告一个keycode
或scancode
。47
另外, a 被解雇
keypress
,报告一个characterñ
。如果您在一台键盘设置为英语的计算机上,将生成一个
keydown
de47
,相同但keypress
不同,报告一个字符;
。(德沃夏克语、西里尔语等键盘的同上)如果我按下修饰键(如Shift, Ctrl, Altor Bloq May)或死键(如变音符号 ´,`或¨西班牙语 or °,~或^其他语言), 然后
keydown
and触发keyup
而不是keypress
.例如:如果您键入
á
press´然后A,它们会触发:keydown
带键码 48keyup
带键码 48keydown
带键码 38keypress
有个性á
keyup
带键码 38也可以问...
因为DOM 的键盘事件标准指定事件应该在操作系统(和系统库等)完成键码到字符的映射之后触发,并且因为实现是一团糟,每个浏览器 web 做任何事情出来了。
也可以问...
因为您不是在测量按键被按下的时间,而是在测量处理每个已触发事件的时间。
如果你用 JavaScript 编程,你是在一个异步而不是并发的环境中,所以事件是一个接一个地处理,但是你不知道什么时候,并且浏览器改变查询范围时总会有时间差. 变量,进行新的函数调用,操作系统改变进程的上下文,等等等等。
您的代码不会立即运行。浏览器必须从触发
keydown
a 到keypress
.您正在寻找的目标:
无法获得。这在IvanSanchez 的回答中得到了很好的解释。
相反,我们可以计算以下值:
简而言之,它们不是真正的值,但与所有测量一样,它们可用于获取行为模式。
注意事项
一个键可以被按住很长一段时间,
keypress
在同一个键按下期间连续触发。在这种情况下,我们将只考虑自上次以来的提升时间keypress
。但是,在 MacOS 上不会触发中间 KeyDown 事件。Linux 可以像 Windows 或 Mac 一样运行,具体取决于平台。
特殊键(Shift、Ctrl、Inicio等)不会生成事件
keypress
。在这种情况下,我们只能强制进行临时(非精确)估计,例如:[tiempo total de presión] / 2
这个计算是错误的,但我们没有真实的事件来获得它。在这些情况下,我们将考虑相等的压力和增强时间。
每个按键开始和结束的时间必须独立保存,因为用户可以同时按下多个按键。例子:
当一个键被正常按下时,事件
keypress
通常在 之后几乎立即被触发keydown
,因此压力变得几乎微不足道,并且高亮实际上将采用非常接近总按下时间的值。此外,在连续输入字符( )期间按住键时aaaaa..
,事件keypress
将非常接近keyup
,因此关系颠倒(压力接近满,高亮可忽略不计)。触发每个事件的延迟还取决于系统负载,或每个事件后执行的计算。为了减少错误程度,建议在数据采集后的某个阶段尽量减少打字、推迟分析或任何其他消耗资源的任务的处理量。
对于无法推迟到后期的处理,建议尝试均质化,尝试执行完全相同的计算,而不管按下的键。
这些是 JavaScript 的局限性。事件是根据取决于许多因素的值触发的,并且通常与按下按键的实际时刻相去甚远。如果你想获得更高精度的值,你可以选择一种不在浏览器中运行的低级语言。这些值并不准确,但可以使用它们自身的不准确性来估计打字动态中的模式。
普通用户使用的键盘不会在按键启动或停止时发送事件,也不会在按键达到最大行程时发送事件。KeyDown、KeyPress 和 KeyUp 事件只是对软件从键输入中解释的内容的解释。
此外,解决 KeyDown、KeyPress 和 KeyUp 事件的解决方案是针对物理键盘的,并且在移动设备上存在严重的兼容性问题。在许多情况下,无需发送密钥代码。
最可靠的时间
如前所述,JavaScript 在获取按键被按下或释放的实际时间方面非常有限。但是,我们可以考虑另一个不确定度较低的变量,其中测量误差往往不显着:密钥间时间。这个变量可以更可靠地用于确定打字模式。
也就是说,在这些情况下,用户在停止按键A和开始按键之间所用的时间B通常是更好的指标。此外,考虑到时间A⟶B不会与时间A⟶相同,它允许我们增加判断力C。
因此,我们还要测量密钥间的时间:
E⟶ j⟶ e⟶ m⟶ p⟶ l⟶o
您希望任何一对密钥都有明显不同的时间。
代码
我得出的结论是以下代码有效。使用jquery,压力时间几乎都是0,是jquery库的原因吗?