Javascript jQuery文档处理程序窃取输入字段中的按键
这个问题以前可能有人问过,但我无法找到合适的搜索短语来定位它,无论是在这里还是在Intertube上 我有一个使用键盘的游戏网页,因此使用jQuery我在文档中设置了处理程序:Javascript jQuery文档处理程序窃取输入字段中的按键,javascript,jquery,Javascript,Jquery,这个问题以前可能有人问过,但我无法找到合适的搜索短语来定位它,无论是在这里还是在Intertube上 我有一个使用键盘的游戏网页,因此使用jQuery我在文档中设置了处理程序: $(document).keydown(myKeydown); $(document).keyup(myKeyup); $(document).blur(myBlur); 但是现在,在输入字段中写入的任何文本都会被文档事件处理程序窃取,只有在文档处理程序中未使用字符时,字符才会到达输入。这些处理程序本质上如下所示: f
$(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
。说:
从处理程序返回false相当于对事件对象调用.preventDefault()和.stopPropagation()
这正是我想要的:为了防止“键入时搜索”,我必须阻止默认操作,即在输入上键入,在页面上“键入时搜索”
(另外,由于某些原因,
keydown
事件处理程序在Firefox最新版本上没有stopPropagation()函数。)有两种方法可以防止这种情况
输入
/文本区域
if ($(event.target).is('input, textarea, select'))
{
return true;
}
在事件处理程序的开始处。要使adeneo的注释保持干净:
function myKeydown(event)
{
if (event.which == 65)
{
console.log('a pressed');
event.stopPropagation();
}
}
$(document).keydown(myKeydown);
这可以使用
在上完成吗,例如$(文档)。在(“keydown”,“not(input,textarea)”,myKeydown);
?@Barmar我想是的!我不建议对mousemove这样的鼠标事件使用此选项,因为它需要根据(可能很复杂)对目标进行评估选择器,在它解析选择器之后。我不确定它对于快速打字机的性能如何,但我仍然无法在jQuery中找到特定的代码,但我怀疑它与调用.is()基本相同
--他们都必须解析选择器,然后对照它检查事件目标。顺便说一句,我个人总是使用。另一方面,如果你决定添加或删除限制选择器,那么语法上的更改就更少了,你的所有代码都遵循相同的模式。另外,我通常只使用选择器将事件绑定到父容器,因为启动代码较少,而且唯一与传播斗争的浏览器是IE6,所以meh…正如adeneo所说,对于输入处理程序,您希望使用e.stopPropagation();
,而不是返回false;
(其中e
是传入的事件)@Ian不是个好主意:如果我不返回false,那么”当我开始键入“kicks in”时搜索文本,我会得到一个搜索框。请注意,我说过我确实想阻止“search as you type”进入搜索框。更改代码不会阻止它。当您键入输入时,是否要阻止控制台日志?这指的是阻止bublingNo,我想阻止“搜索文本”,这是默认操作<代码>返回false
还可以防止冒泡,因此在这方面没有改进。请看我添加到问题中的注释。