![](/img/trans.png)
[英]JavaScript event listener that fires when I hit enter on the input element on webpages
[英]Keyup event listener fires when enter is pressed on Chrome's Ominbox
在Chrome浏览器中,使用此代码段时:
$(document).on('keyup', function(){
alert("Hey");
});
每当我按下url栏中的enter
键时(例如,当我剪切并粘贴页面本身的url时),事件监听器就会触发。 为什么会这样?
编辑:
它让我感到惊讶,因为url bar不在document
(可能在window
?)而firefox没有这种行为。 当我查找e.target
,Chrome Inspector会显示body
。
我认为这可能是由事件冒泡引起的所以我试过这个:
$(document).on('keyup', function(e){
e.stopPropagation();
alert("Hey");
});
但它不起作用。 如何防止它被触发?
发生这种情况是因为一旦你在多功能框中输入,焦点就会转向页面。 如果你用onkeydown
尝试过同样的事情,多功能框就不会改变,因为正如你所说,它不是文档的一部分。 过滤多功能框的错误事件的一种方法是检查每个keyup
是否有一对keydown。
<script>
var down = false;
document.addEventListener('keydown', function (){
down = true;
}, false);
document.addEventListener('keyup', function (){
if(down === true){
alert('It was from the page!');
}
else{
alert('Omnibox. Ignore it.');
}
down = false;
}, false);
</script>
制作自己的HTML页面并优先尝试,因为PasteHTML.com将其填充到iframe中。
要使其在此处正常工作,请先单击文本以获得iframe焦点。
演示。 请记住使用鼠标将焦点放在多功能框上并键入,而不是键盘快捷键。 (这会引发onkeydown事件,造成误报)
更新:从Chrome 35开始,这种情况不再发生了。 但是,我不知道他们修复了哪个版本。
Chrome的解决方案很简单:使用keypress
而不是keyup
。 这并不适用于所有情况(IE),因此您可能必须添加条件才能根据浏览器切换类型。 但是,这将解决您的问题。
请注意,查找特定的密钥代码可能会使您的问题无效。 祝好运。
因为keyup
当任何按键在键盘上公布的情况,这就是触发事件。 当文档没有焦点时,Chrome只会在使用代码段时触发此事件。
您可以过滤密钥代码...如果有帮助... 13输入密钥
$(document).on('keyup', function(event){
if( parseInt(event.keyCode,10) !== 13 ){
alert("Hey");
}
});
一种可能的解决方案是稍微延迟“keyup”事件处理程序注册。 这将跳过Chrome和Safari中似乎发生的第一个“虚假”触发器。
$(function() {
setTimeout(
function() {
console.log("Delayed event attachment");
$(document).bind('keyup', log);
}, 10);
});
function log(e) {
console.log(e.target.localName);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.