按向上箭头时防止文本输入中的默认行为

rid*_*dle 32 javascript keyboard events default input

我正在使用<input type="text"/>带有数值的基本HTML 文本字段.

我正在添加JavaScript事件keyup以查看用户何时按下向上箭头键(e.which == 38) - 然后我增加数值.

代码运行良好,但有一件事让我感到困扰.当我按下向上箭头键时,Safari/Mac和Firefox/Mac都会在最开始移动光标.<input type="text"/>据我所知,这是每个文本字段的默认行为,这是有道理的.

但这不会产生光标前后跳跃的美学效果(在值改变之后).

开始时的跳跃发生了,keydown但即使有了这些知识,我也无法防止它发生.我尝试了以下方法:

input.addEventListener('keydown', function(e) {
    e.preventDefault();
}, false);
Run Code Online (Sandbox Code Playgroud)

e.preventDefault()keyup事件也没有帮助.

有没有办法防止光标移动?

Kor*_*nel 28

要保留光标位置,请input.selectionStart在更改值之前进行备份.

问题在于WebKit对keydownOpera和首选方做出反应keypress,因此存在问题:两者都被处理和限制.

var ignoreKey = false;
var handler = function(e)
{
    if (ignoreKey)
    {
        e.preventDefault();
        return;
    }
    if (e.keyCode == 38 || e.keyCode == 40) 
    {
        var pos = this.selectionStart;
        this.value = (e.keyCode == 38?1:-1)+parseInt(this.value,10);        
        this.selectionStart = pos; this.selectionEnd = pos;

        ignoreKey = true; setTimeout(function(){ignoreKey=false},1);
        e.preventDefault();
    }
};

input.addEventListener('keydown',handler,false);
input.addEventListener('keypress',handler,false);
Run Code Online (Sandbox Code Playgroud)


Luk*_*kas 16

我发现更好的解决方案就是return false;防止默认的箭头键行为:

input.addEventListener("keydown", function(e) {
    if (e.key === 'ArrowUp' || e.key === 'ArrowDown') return false;
}, false);
Run Code Online (Sandbox Code Playgroud)

  • 对 - keydown就是诀窍.注意,返回false似乎完全停止事件的传播,而`preventDefault()`将让输入框忽略该事件,同时仍然允许其他侦听器在它冒泡时处理它. (4认同)
  • @Lukas,您的解决方案最适合我.但是,我正在调用`e.preventDefault();`而不是返回`false`.后者没有实现向上箭头键行为的冻结.感谢您发布一个替代的,更简单的解决方案. (4认同)

JCh*_*___ 5

实际上,有一种更好,更简单的方法可以完成这项工作。

$('input').bind('keydown', function(e){
    if(e.keyCode == '38' || e.keyCode == '40'){
        e.preventDefault();
    }
});
Run Code Online (Sandbox Code Playgroud)

是的,这很容易!