Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.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 如何在jQuery中识别长按箭头键_Javascript_Jquery_Keypress_Keydown - Fatal编程技术网

Javascript 如何在jQuery中识别长按箭头键

Javascript 如何在jQuery中识别长按箭头键,javascript,jquery,keypress,keydown,Javascript,Jquery,Keypress,Keydown,我自己有两个选择keypress和keydown。我倾向于使用按键,因为它记录了一个事件,即使按键重复,也就是长时间按下。但问题是,keypress只在Firefox中记录特殊键,如箭头键。如果我想跨浏览器执行此操作,则必须使用keydown,但长按将被记录为单个事件 非常感谢您的帮助。有一个名为的插件可能有助于实现此目标。有一个名为的插件可能有助于实现此目标 var pressed = null; $(element).on('keydown', function(event) { p

我自己有两个选择
keypress
keydown
。我倾向于使用
按键
,因为它记录了一个事件,即使按键重复,也就是长时间按下。但问题是,
keypress
只在Firefox中记录特殊键,如箭头键。如果我想跨浏览器执行此操作,则必须使用
keydown
,但长按将被记录为单个事件

非常感谢您的帮助。

有一个名为的插件可能有助于实现此目标。

有一个名为的插件可能有助于实现此目标

var pressed = null;
$(element).on('keydown', function(event) {
    pressed = +new Date();
    // do whatever else you need upon key down
});
$(element).on('keyup', function(event) {
    var duration = +new Date() - pressed;
    pressed = null;
    // do whatever you need to do based on the duration of the press
});
我把它作为一个练习留给你们去解决对多个同时按下的键的支持


我把它作为一个练习留给您来解决对多个同时按下的按键的支持。

您可以使用两个事件,如下所示:

var timer=false,
    pressedTime = 1000; //one second

$('input').on({
    keydown: function(e) {
        var charCode = (e.which) ? e.which : event.keyCode, keyP;
        if (charCode===37) keyP = 'left';
        if (charCode===38) keyP = 'up';
        if (charCode===39) keyP = 'right';
        if (charCode===40) keyP = 'down';        
        if (!timer) timer = setTimeout(function() {
           clearTimeout(timer);
           timer=false;
           alert(keyP+' arrow key held down for 1 second');
        }, pressedTime);
    },
    keyup: function() {
        clearTimeout(timer);
        timer=false;
    }
});​

您可以使用两个事件,如下所示:

var timer=false,
    pressedTime = 1000; //one second

$('input').on({
    keydown: function(e) {
        var charCode = (e.which) ? e.which : event.keyCode, keyP;
        if (charCode===37) keyP = 'left';
        if (charCode===38) keyP = 'up';
        if (charCode===39) keyP = 'right';
        if (charCode===40) keyP = 'down';        
        if (!timer) timer = setTimeout(function() {
           clearTimeout(timer);
           timer=false;
           alert(keyP+' arrow key held down for 1 second');
        }, pressedTime);
    },
    keyup: function() {
        clearTimeout(timer);
        timer=false;
    }
});​

您的代码无法工作。您必须存储keyCode,以确保keyup与keydown相关联。@DieVarDump您显然错过了代码段下的行。
new Date()
返回一个日期实例
Date.now()
返回从纪元开始的毫秒数。因为我们要计算一个持续时间,所以查看完整的日期实例是没有意义的。同意@Derek的观点,如果
date.now()
在所有浏览器中都不起作用,并且键入的日期几乎不比
+new date
少,那么使用
date.now()有什么意义呢
+new Date
不会返回新的日期实例,事实上,填充
Date.now()
的方法是
+new Date()
,正如这里所建议的@lanzz No,根据MDN,它是2009年发布的ecmascript edition 5的一部分。您的代码将无法工作。您必须存储keyCode,以确保keyup与keydown相关联。@DieVarDump您显然错过了代码段下的行。
new Date()
返回一个日期实例
Date.now()
返回从纪元开始的毫秒数。因为我们要计算一个持续时间,所以查看完整的日期实例是没有意义的。同意@Derek的观点,如果
date.now()
在所有浏览器中都不起作用,并且键入的日期几乎不比
+new date
少,那么使用
date.now()有什么意义呢
+new Date
不会返回新的日期实例,事实上,填充
Date.now()
的方法是
+new Date()
,正如这里所建议的@lanzz No,根据MDN的说法,它是2009年发布的ecmascript edition 5的一部分,没有任何帮助。我试图做的是将用户的所有键盘操作复制到另一个文本框中。响应性将更有助于减少我为复制操作而拨打的电话数量。我可能会考虑这件事以后,一旦我有一个基本的版本运行,不会有帮助。我试图做的是将用户的所有键盘操作复制到另一个文本框中。响应性将更有助于减少我为复制操作而拨打的电话数量。当我有一个基本版本运行后,我可能会考虑这件事。我在某个地方读到的keydown比,keyup更适合这件事,但我认为在我的情况下,任何人都会像你在这里读到的一样工作:。我在某个地方读到的keydown比,但我认为在我的情况下,任何人都会这样做:。@Ghokun-谢谢,似乎是最简单的方法,在JS中应该避免长时间争论对象。@Ghokun-谢谢,似乎是最简单的方法,在JS中应该避免长时间争论对象。