Jquery 在keydown*而不是*keydup上获取.val()

Jquery 在keydown*而不是*keydup上获取.val(),jquery,javascript-events,Jquery,Javascript Events,我正在编写一个将小部件修改为文本区域的库,因此我需要检测用户何时开始键入内容: this.$input.bind('keydown keyup', function() { if (this.$input.val() == …) { … } } .val()仅在触发keyup时更新。耽搁太久了。我想知道keydown上输入框的状态。你知道有一个库改进了.val()?太晚了吗?无法想象10ms会有这么大的不同,但是您可以随时检查事件args并从中获取字符。或者试试看 编辑:还有一种方法在

我正在编写一个将小部件修改为文本区域的库,因此我需要检测用户何时开始键入内容:

this.$input.bind('keydown keyup', function() {
    if (this.$input.val() == …) { … }
}

.val()
仅在触发
keyup
时更新。耽搁太久了。我想知道
keydown
上输入框的状态。你知道有一个库改进了
.val()

太晚了吗?无法想象10ms会有这么大的不同,但是您可以随时检查事件args并从中获取字符。或者试试看


编辑:还有一种方法在输入更改时立即触发(在键控之前,但在值更改之后)

确定
keydown
/
keypress
处字符的唯一方法是使用
event.keyCode
event.which
属性(其中
event
是一个对象,作为第一个参数传递给事件侦听器函数)

将事件交换为
按键
事件。此事件侦听器在按键时被激发
keydown
keydup
仅触发一次。在
keydown
/
keydup
事件期间,可能添加了多个字符。

对于按键(例如“a”键),在文本输入中附加“a”之前触发
keydown
事件。您可以检测事件类型,以及
.keyCode
(或
.which
)事件属性是否是可打印范围内的键,并尝试预测
.val()
keyup
事件后可能返回的内容,但这是一个坏主意

this.$input.bind('keydown keyup', function(e) {
    var val = this.$input.val();

    if (e.type == 'keydown') {
        // Here is where you would check to see if e.keyCode was a printable
        // character.  Note that key codes differ from ASCII codes. For
        // example, the "a" key will return key code 65, which is actually
        // the ASCII code for "A", so you would need to check for the presence
        // of shift keys and such.  Again, this is a bad idea :)
        val += String.fromCharCode(e.keyCode);
    }

    if (val == …) { … }
}

。使用前面提到的HTML5
oninput
onpropertychange
作为IE.Brilliant的后备方案。好极了其他令人高兴的词。

由于输入框的文本会立即对键盘输入做出反应,我的小部件的延迟响应非常突出。哦,这是一个HTML5 DOM事件。马修:那我的工作就不会那么轻松了。@Matthew:因为这是在把一个方形的钉子塞进一个圆孔。根据定义,
keydown
事件发生在按键上的任何其他事件之前。这意味着,任何控制文本翻译的关键都还没有机会运行。因此,它基本上是以一种不那么直观和全面的方式重新实现翻译逻辑。换句话说,你将重新发明一个劣质的轮子。