2012-08-16 68 views
7

在Chrome浏览器中,使用此片段时:KEYUP事件侦听器触发时进入被压在Chrome的Ominbox

$(document).on('keyup', function(){ 
    alert("Hey"); 
    }); 

每次我在地址栏按enter(例如,当我剪切和粘贴的网址页面本身)事件监听器触发。 为什么会发生?

编辑:

这让我感到惊讶,因为地址栏是不是在document(也许在window?)和Firefox没有这种行为。当我查找e.target时,Chrome Inspector显示body

我认为这可以通过事件引起的鼓泡,所以我尝试这样做:

$(document).on('keyup', function(e){ 
    e.stopPropagation(); 
    alert("Hey"); 
    }); 

但它不工作。 我该如何防止它被触发?

回答

8

这是因为一旦你打在网址列输入,将重点转向页面。如果您尝试使用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

因为keyup是在键盘上释放任何键时发生的,所以会触发事件。 Chrome只是在文档没有焦点时触发此事件,显然,在使用代码段时。

+1

听起来像窗口*确实*有焦点,即使文档没有。真的不是非常令人惊讶的行为。 – Thor84no 2012-08-16 15:58:23

+0

我不确定,但我知道浏览器的很多插件都是基于JavaScript的,很多浏览器也运行它,所以我猜不是。 – user1601369 2012-08-16 16:01:52

+0

这是不正确的。 Chrome在文档焦点时触发事件。在这种情况下,当你按下回车键时,'onkeydown',文档得到焦点,并且由于文档现在有焦点,'onkeyup',弹出警报。 – 2012-08-25 06:24:29

0

你可以筛选键码......如果可以帮助... 13是回车键

$(document).on('keyup', function(event){ 
    if(parseInt(event.keyCode,10) !== 13){ 
     alert("Hey"); 
    } 
});​ 
+0

我需要该事件触发我的页面内的其他有趣的事情;) – 2012-08-25 20:01:01

2

Chrome的解决方案很简单:使用keypress而不是keyup。这在所有情况下都不起作用(IE),因此您可能必须添加一个条件才能根据浏览器切换类型。但是,这将解决您的问题。

请注意,查找特定的键码可能会消除您的问题。祝你好运。

+0

'keypress'和'keyup'不是同一件事。 – 2012-08-25 08:24:57

+1

@Amaan不,他们不是。但是,它们可能是可以互换的,取决于提交者打算在关键事件中实现的功能。 – 2012-08-26 21:32:45

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); 
} 
相关问题