Javascript捕获keydown

时间:2014-11-12 09:28:04

标签: javascript

我有一个包含多个字段的表单,当用户在任何字段doSomething()中执行“双输入”时,应该会发生。

下面的代码基本上可行,除了doSomething()被调用的次数与该字段中的字符一样多。它应该只被调用一次,而如果我在字段中放置“ABC”,doSomething()被称为3X。无论在现场输入什么,只需在2X Enter后调用一次。

我(有点)理解为什么会发生这种情况(keydown被称为3次),但不知道如何解决它。我需要unbind某事吗?当0不是e.keyCode时,将计数器重置为13似乎没有任何区别。

编辑 - http://jsfiddle.net/hzr8cezn/ - 我正在使用2X SPACE bar字符进行测试,因为Enter尝试在jsfiddle上提交表单。点击2X空间(在Chrome中)并检查您的控制台

$("#dynamicFields").on('keydown', 'input', function(e) {
        var counter = 0
        var field = $(this)
        field.keydown(function (e) {
            if(e.keyCode == 13) {
                counter++;
                if(counter == 2) {
                    console.log('twice!')
                    doSomething()
                } 
            }
            else {
                 counter = 0
            }
        })
    })

1 个答案:

答案 0 :(得分:3)

您将使用on()使用keydown()并使用// init counter to 0 $("#dynamicFields input").data('counter',0); // bind to keypress event $("#dynamicFields").on('keydown', 'input', function(e) { // the input field var $field = $(this); // enter key? if ( e.keyCode == 13 ){ // how many times? var counter = $field.data('counter'); // increment it $field.data('counter',++counter); // do the stuff if ( counter >= 2 ){ alert('well, you did it.'); } } else { // reset $field.data('counter',0); } }) 附加“keydown”事件两次。你只需要这样做一次。

由于您要跟踪每个元素的计数器,因此您可以使用data()调用在元素本身上跟踪它。

{{1}}

请参阅此jsFiddle