我有两个功能.当按下enter时,功能正常运行,但是当按下escape时它不会.转义键的正确数字是多少?
$(document).keypress(function(e) { if (e.which == 13) $('.save').click(); // enter (works as expected) if (e.which == 27) $('.cancel').click(); // esc (does not work) });
CMS.. 909
尝试使用keyup事件:
$(document).keyup(function(e) { if (e.keyCode === 13) $('.save').click(); // enter if (e.keyCode === 27) $('.cancel').click(); // esc });
"这与keyup vs. keypress无关" - 这是不正确的,dkamins.在浏览器之间似乎没有一致地处理keypress(在IE浏览器中尝试http://api.jquery.com/keypress/的演示与Chrome和Firefox的比较 - 有时它不会注册,并且'和' 'keyCode'变化)而keyup是一致的.e.which是jquery-normalized值,因此'which'或'keyCode'都应该在keyup中工作. (210认同)
这与keyup与keypress无关.要捕获ESCAPE,您需要查看e.keyCode而不是e.which(这个例子碰巧会这样做). (39认同)
`keydown`将模仿原生行为 - 至少在Windows上,在对话框中按ESC或Return键会在释放键之前触发操作. (15认同)
@Jordan Brough - 我想请求您发表评论作为答案,以便人们阅读并理解您评论的实际含义!因为你的评论和答案解释一样重要 (13认同)
@gibberish我在这里添加了我的评论作为答案:http://stackoverflow.com/a/28502629/58876 (2认同)
Seth Petry-J.. 74
不要硬编码函数中的键码值,而应考虑使用命名常量来更好地表达您的含义:
var KEYCODE_ENTER = 13; var KEYCODE_ESC = 27; $(document).keyup(function(e) { if (e.keyCode == KEYCODE_ENTER) $('.save').click(); if (e.keyCode == KEYCODE_ESC) $('.cancel').click(); });
某些浏览器(如FireFox,不确定其他浏览器)定义了一个全局KeyEvent
对象,为您公开这些类型的常量.这个SO问题也显示了在其他浏览器中定义该对象的好方法.
尝试使用keyup事件:
$(document).keyup(function(e) { if (e.keyCode === 13) $('.save').click(); // enter if (e.keyCode === 27) $('.cancel').click(); // esc });
不要硬编码函数中的键码值,而应考虑使用命名常量来更好地表达您的含义:
var KEYCODE_ENTER = 13; var KEYCODE_ESC = 27; $(document).keyup(function(e) { if (e.keyCode == KEYCODE_ENTER) $('.save').click(); if (e.keyCode == KEYCODE_ESC) $('.cancel').click(); });
某些浏览器(如FireFox,不确定其他浏览器)定义了一个全局KeyEvent
对象,为您公开这些类型的常量.这个SO问题也显示了在其他浏览器中定义该对象的好方法.
(从我以前的评论中提取的答案)
你需要使用keyup
而不是keypress
.例如:
$(document).keyup(function(e) { if (e.which == 13) $('.save').click(); // enter if (e.which == 27) $('.cancel').click(); // esc });
keypress
似乎没有在浏览器之间一致地处理(在IE浏览器和Chrome与Firefox 中的http://api.jquery.com/keypress上试用该演示.有时keypress
不注册,以及'哪个'和'的值keyCode'变化',但是keyup
是一致的.
由于有一些关于e.which
vs的讨论e.keyCode
:注意这e.which
是jquery-normalized值,并且是推荐使用的值:
event.which属性规范化event.keyCode和event.charCode.建议观看event.which键盘输入键.
(来自http://api.jquery.com/event.which/)
要查找任何键的键码,请使用以下简单功能:
document.onkeydown = function(evt) { console.log(evt.keyCode); }
27
是转义键的代码.:)
你最好的选择是
$(document).keyup(function(e) { if (e.which === 13) $('.save').click(); // enter if (e.which === 27) $('.cancel').click(); // esc /* OPTIONAL: Only if you want other elements to ignore event */ e.preventDefault(); e.stopPropagation(); });
摘要
which
比keyCode
归一化更优选
keyup
比keydown
如果用户按下它可以多次出现keydown 更为可取.
keypress
除非您想捕获实际字符,否则请勿使用.
有趣的是,Bootstrap在其下拉组件中使用了keydown和keyCode(从3.0.2开始)!我认为这可能是糟糕的选择.
来自JQuery doc的相关代码片段
虽然浏览器使用不同的属性来存储此信息,但jQuery会规范化.which属性,以便您可以可靠地使用它来检索密钥代码.此代码对应于键盘上的键,包括特殊键(如箭头)的代码.为了捕获实际的文本输入,.keypress()可能是更好的选择.
其他感兴趣的项目:JavaScript Keypress Library
试试jEscape插件(从谷歌硬盘下载)
$(document).escape(function() { alert('ESC button pressed'); });
或获取跨浏览器的密钥代码
var code = (e.keyCode ? e.keyCode : e.which); if (code === 27) alert('ESC'); if (code === 13) alert('ENTER');
也许你可以使用开关
var code = (e.keyCode ? e.keyCode : e.which); switch (code) { case 27: alert('ESC'); break; case 13: alert('ENTER'); break; }
你的代码工作得很好.这很可能是没有集中注意力的窗口.我使用类似的功能关闭iframe框等.
$(document).ready(function(){ // Set focus setTimeout('window.focus()',1000); }); $(document).keypress(function(e) { // Enable esc if (e.keyCode == 27) { parent.document.getElementById('iframediv').style.display='none'; parent.document.getElementById('iframe').src='/views/view.empty.black.html'; } });
我正在尝试做同样的事情而且它正在惹恼我.在firefox中,似乎如果你在按下转义键时尝试做一些事情,它会继续处理转义键,然后取消你想要做的任何事情.警报工作正常.但就我而言,我想回到历史上不起作用.终于想通了我必须强制事件的传播停止,如下所示......
if (keyCode == 27) { history.back(); if (window.event) { // IE works fine anyways so this isn't really needed e.cancelBubble = true; e.returnValue = false; } else if (e.stopPropagation) { // In firefox, this is what keeps the escape key from canceling the history.back() e.stopPropagation(); e.preventDefault(); } return (false); }
要获取所有字符的十六进制代码:http://asciitable.com/
解释其他答案没有的地方; 问题是你的使用keypress
.
也许这个事件只是错误的命名,但keypress
被定义为触发时.即文字.
而你想要的是/ ,无论何时(分别在之前或之后)都会发射.就是键盘上的那些东西.when an actual
character
is being inserted
keydown
keyup
the user depresses a
key
这里出现的差异esc
是因为它是一个控制字符(字面意思是'非打印字符'),因此不会写任何文本,因此甚至不会触发keypress
.
enter
很奇怪,因为即使你使用它作为控制字符(即控制UI),它仍然会插入一个新行字符,它将触发keypress
.
资料来源:quirksmode
仅发布更新的答案,而不是e.keyCode
在MDN上认为已弃用。
相反,您应该选择e.key
支持所有名称的纯名称。这是相关的复制面食
window.addEventListener("keydown", function (event) { if (event.defaultPrevented) { return; // Do nothing if the event was already processed } switch (event.key) { case "ArrowDown": // Do something for "down arrow" key press. break; case "ArrowUp": // Do something for "up arrow" key press. break; case "ArrowLeft": // Do something for "left arrow" key press. break; case "ArrowRight": // Do something for "right arrow" key press. break; case "Enter": // Do something for "enter" or "return" key press. break; case "Escape": // Do something for "esc" key press. break; default: return; // Quit when this doesn't handle the key event. } // Cancel the default action to avoid it being handled twice event.preventDefault(); }, true);