jQuery文档处理程序在输入字段中窃取按键

时间:2012-12-14 00:04:30

标签: javascript jquery

之前可能已经提出过这个问题,但我无法找到合适的搜索词组来定位它,无论是在这里还是在intertubes上。

我有一个使用键盘的游戏网页,所以使用jQuery我在文档中设置了处理程序:

$(document).keydown(myKeydown);
$(document).keyup(myKeyup);
$(document).blur(myBlur);

但是现在在输入字段中写入的任何文本都被文档事件处理程序窃取,如果字符处理程序中没有使用它们,则字符只会到达输入。这些处理程序本质上看起来像这样:

function myKeydown(event)
{
    if (event.which == 65)
    {
        console.log('a pressed');
        return false;
    }
    return true;
}

现在假设我有一个文本输入框;如果我按下输入中显示的除'a'以外的任何键,但不是'a'(因为myKeydown通过返回false来“吃掉”它)。在任何情况下我都可以返回true,但是如果没有输入框被聚焦,我会得到奇怪的东西,比如“键入时搜索”,如果启用的话。

我尝试为输入框添加处理程序:

input.keydown(function() { console.log('down'); return false; });
input.keyup(function() { console.log('up'); return false; });
input.blur(function() { console.log('blur'); return false; });

使用这段代码我得到了console.logs,但当然键没有到达盒子(因为我对压力机什么也没做)。我可以在某处发送这些事件,以便相应的键出现在输入框中吗?

注意:有些人建议使用event.stopPropagation()代替return falsejQuery docs说:

  

从处理程序返回false等同于在事件对象上调用.preventDefault()和.stopPropagation()。“

这正是我想要的:为了防止“键入时搜索”,我必须阻止默认操作,即在输入上键入并在页面上“键入时搜索”。 / p>

(另外,由于某种原因,keydown事件处理程序在Firefox上没有stopPropagation()函数。)

2 个答案:

答案 0 :(得分:2)

发表评论adeneo clean:

function myKeydown(event)
{
    if (event.which == 65)
    {
        console.log('a pressed');
        event.stopPropagation();
    }
}
$(document).keydown(myKeydown);

sample

答案 1 :(得分:1)

防止这种情况的两种方法。

  1. 在事件处理程序中获取目标,如果目标是input / textarea

  2. ,则忽略您的代码
  3. 将同一事件绑定到输入并停止传播

  4. 第一个选择是正确的做法,IMO。尝试:

    if ($(event.target).is('input, textarea, select'))
    {
        return true;
    }
    

    在事件处理程序的开头。