Javascript event.keycode在firefox中未返回正确的值
当在输入框中按下空格键时,我正在尝试以下代码来触发js方法Javascript event.keycode在firefox中未返回正确的值,javascript,jquery,events,keypress,keycode,Javascript,Jquery,Events,Keypress,Keycode,当在输入框中按下空格键时,我正在尝试以下代码来触发js方法 <input id="j1" /> $('#j1').keypress (function (event){ alert(event.keycode) }); $('#j1')。按键(功能(事件){ 警报(event.keycode) }); 在firefox中,只有当按下enter键时,才会返回正确的值,其他键每次返回的值都是0。在IE/chrome中,这非常有效。问题在于并非所有浏览器
<input id="j1" />
$('#j1').keypress (function (event){
alert(event.keycode)
});
$('#j1')。按键(功能(事件){
警报(event.keycode)
});
在firefox中,只有当按下
enter
键时,才会返回正确的值,其他键每次返回的值都是0。在IE/chrome中,这非常有效。问题在于并非所有浏览器在按键上都有相同的实现。解决方案是检查注册密钥的所有可能位置。在这种情况下:event.keycode
和event.which
有关更多信息,请参阅本文
编辑
终于找到了我的旧函数,这是我实际使用的代码:
evt = (evt) ? evt : event;
var charCode = evt.which || evt.charCode || evt.keyCode || 0;
在非IE浏览器中,您希望在keypress
事件中使用which
或charCode
属性,而不是keyCode
属性。keypress
事件用于检测键入的字符,而keyup
和keydown
用于检测物理键(在这些事件中,keyCode
在每个主要浏览器中都起作用)
但是,jQuery使用类似于此的代码规范化按键事件的属性,因此在jQuery中您只需要
var charCode = event.which;
有关键事件的(更多)详细信息,请参阅。如果事件.keyCode
没有返回正确的值,那么对于firefox,您可以使用事件.charCode
var keyValue = event.charCode || event.keyCode;
KeyboardEvent.keyCode:
不同浏览器之间的按键事件值不同。IE和
Google Chrome设置KeyboardEvent.charCode值。壁虎设置0如果
按下的键是可打印的键,否则会设置相同的键码
作为keydown或keydup事件
所以从Firefox的角度来看,它实际上返回了正确的值。看
keyCode
,哪些
,keyIdentifier
和charCode
不推荐使用
此功能已从Web标准中删除。虽然一些浏览器可能仍然支持它,但它正在被开发中
下降。避免使用,并尽可能更新现有代码
keyIdentifier
在IE和Firefox中不受支持,已从Opera和Chrome中删除
将charCode
作为非标准
此功能是非标准的,不在标准轨道上。不要在面向Web的生产站点上使用它:它不会适用于所有用户。实现之间也可能存在很大的不兼容性
那么,还有什么选择呢
I.改用键
属性
保存与按下的键对应的键属性值
示例:
“a”、“a”、“@”、“百分比”、“美元”、“ا”、“ب”、“㶡”、“ت”、“١”、“٢”、“٣”、“制表符”、“输入”,所有“F1”`
它赢得了所有主流浏览器(Firefox52、Chrome55、Safari10.1、Opera46)的支持,但InternetExplorer11除外
非标准密钥标识符和AltGraph的错误行为
如果这一点很重要,并且/或者向后兼容性很重要,那么您可以在以下代码中使用功能检测:
请注意,key
值与keyCode
或的属性不同,因为它包含键的名称,而不是其代码。如果程序需要字符代码,则可以使用charCodeAt()
。
对于单个可打印字符,如果要处理其值包含多个字符(如ArrowUp)的键,则可以使用charCodeAt()
机会是:您正在测试特殊密钥,并采取相应的措施。因此,请尝试实现一个键值表及其对应的
代码charCodeArr[“ArrowUp”]=38
,charCodeArr[“Enter”]=13
,charCodeArr[Escape]=27
。。。等等,请看一下他们的
二、 您还可以使用code
属性:
保存一个字符串,该字符串标识正在按下的物理键。这个
值不受当前键盘布局或修改器的影响
状态,因此特定键将始终返回相同的值
它具有类似于键
属性的效果,并且对于带有QUERTY的美国键盘上按下的按钮W,它的输出类似于“keyW”
布局。如果在另一个版面(AZERTY)或另一种语言(希伯来语)中按下同一按钮,或与修改器组合使用
(shift),key
属性将相应更改,而code
属性仍将具有相同的值“keyW”
更多关于这个
Chrome 49、Firefox 52、Safari 10.1和Opera 46支持code
属性,但Internet Explorer不支持该属性
另见:
如果无论按哪个键都得到0
,请尝试使用charCode
而不是keyCode
这是因为您正在调用使用which
和charCode
的KeyboardEvent对象,而不是使用keyCode
返回键盘Unicode值的事件对象。有关更多信息,请参阅MDN web文档以了解有关键盘事件的更多信息:
在firefoxyes中,这将返回未定义的回车
,但OP正在尝试捕捉空格键(
keypress=),感谢您指出这一点。实际上是在运行中输入的=)编辑的版本应该可以工作evt.which | | | evt.charCode | | evt.keyCode | | 0
-50%space@Rolando,@SomeGuy:另外,根本不需要使用charCode
。每个支持charCode
的浏览器也支持哪个
,有些(Opera)只支持哪个
。
var keyValue = event.charCode || event.keyCode;
readonly attribute DOMString key
if(e.key!=undefined){
var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0);
}else{
/* As @Leonid suggeted */
var characterCode = e.which || e.charCode || e.keyCode || 0;
}
/* ... code making use of characterCode variable */
readonly attribute DOMString code