之前可能已经提出过这个问题,但我无法找到合适的搜索词组来定位它,无论是在这里还是在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 docs说:
从处理程序返回false等同于在事件对象上调用.preventDefault()和.stopPropagation()。“
这正是我想要的:为了防止“键入时搜索”,我必须阻止默认操作,即在输入上键入并在页面上“键入时搜索”。 / p>
(另外,由于某种原因,keydown
事件处理程序在Firefox上没有stopPropagation()函数。)
答案 0 :(得分:2)
发表评论adeneo clean:
function myKeydown(event)
{
if (event.which == 65)
{
console.log('a pressed');
event.stopPropagation();
}
}
$(document).keydown(myKeydown);
答案 1 :(得分:1)
防止这种情况的两种方法。
在事件处理程序中获取目标,如果目标是input
/ textarea
将同一事件绑定到输入并停止传播
第一个选择是正确的做法,IMO。尝试:
if ($(event.target).is('input, textarea, select'))
{
return true;
}
在事件处理程序的开头。