在Chrome浏览器中,使用此代码段时:
$(document).on('keyup', function(){
alert("Hey");
});
每当我在网址栏中按enter
时(例如,当我剪切并粘贴网页的网址时),事件监听器就会触发。
为什么会这样?
修改
它让我感到惊讶,因为网址栏不在document
中(可能在window
?)并且firefox没有此行为。当我查找e.target
时,Chrome Inspector会显示body
。
我认为这可能是由事件冒泡引起的,所以我尝试了这个:
$(document).on('keyup', function(e){
e.stopPropagation();
alert("Hey");
});
但它不起作用。 如何防止它被触发?
答案 0 :(得分:9)
这是因为一旦您在多功能框中输入,焦点就会转到页面。如果您使用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>
<击> Demo. 击>
<击> 制作您自己的HTML页面并优先尝试,因为PasteHTML.com将其填充到iframe中。要使其在此处正常工作,请先单击文本以获得iframe焦点。
Demo. 请记住使用鼠标将焦点放在多功能框上并键入,而不是键盘快捷键。 (这会引发onkeydown事件,造成误报)
更新:从Chrome 35开始,这种情况不再发生了。但是,我不知道他们修复了哪个版本。
答案 1 :(得分:2)
Chrome解决方案很简单:使用keypress
代替keyup
。这并不适用于所有情况(IE),因此您可能必须添加条件才能根据浏览器切换类型。但是,这将解决您的问题。
请注意,查找特定的密钥代码可能会使您的问题无效。祝你好运。
答案 2 :(得分:1)
因为当键盘上释放任何键时发生keyup
,这就是触发事件的原因。当文档没有焦点时,Chrome只会在使用代码段时触发此事件。
答案 3 :(得分:1)
您可以过滤键码...如果有帮助...... 13是输入键
$(document).on('keyup', function(event){
if( parseInt(event.keyCode,10) !== 13 ){
alert("Hey");
}
});
答案 4 :(得分:0)
一种可能的解决方案是稍微延迟“keyup”事件处理程序注册。这将跳过Chrome和Safari中似乎发生的第一个“虚假”触发器。
$(function() {
setTimeout(
function() {
console.log("Delayed event attachment");
$(document).bind('keyup', log);
}, 10);
});
function log(e) {
console.log(e.target.localName);
}