1

这个问题之前可能已经被问过,但我无法找到合适的搜索短语来定位它,无论是在这里还是在 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 false. jQuery 文档说:

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

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

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

4

2 回答 2

2

要评论adeno clean:

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

样本

于 2012-12-14T01:06:33.493 回答
1

有两种方法可以防止这种情况。

  1. 在事件处理程序中获取目标,如果目标是input/ ,则忽略您的代码textarea

  2. 将相同的事件绑定到输入并停止传播

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

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

在事件处理程序的开头。

于 2012-12-14T00:16:41.613 回答