JavaScript事件e.which是什么?

81
JavaScript事件中的e.which是什么功能?请举例简要说明。

45
两年后,我在其他几页阅读后仍然无法理解这个属性,遇到了这篇旧文章后恍然大悟。因此,对于@Reigel来说,在告诉某人去谷歌之前,可能要重新考虑一下。也许他们已经这样做了。这不是Stack Overflow的目的。 - temporary_user_name
@Aerovistae,在那个时候,搜索谷歌会给你类似于http://www.quirksmode.org/js/events_properties.html的东西...这已经非常有帮助了... - Reigel Gallarde
Tim Down的回答比目前被接受的答案要好得多。 - Toskan
5
@JuanMendes - 我通过谷歌搜索“javascript event.which”找到了这里,它是第一个结果。你认为这是不可取的吗?我的意思是,你似乎更希望这个问题从未在这里被问到或回答过。 - Kevin Fegan
4个回答

83

whichEvent对象的一个属性。在大多数浏览器中,它被定义为与按键和鼠标有关的事件,但在IE(版本9之前)中两种情况下都未被定义。

对于与鼠标有关的事件,which指定涉及的鼠标按钮。对于IE<9,相应的值可在window.event.button中找到。为了使情况更加复杂,非IE浏览器还支持一种鼠标事件的button属性,有时会报告与which不同的值。此外,浏览器有时对于相同的按钮或按钮组合具有不同的值。如果您坚持在所有支持它的浏览器中使用which和IE<9中的button,则唯一的常数是值为1始终表示涉及左鼠标按钮(但并不一定仅限于此)。

document.onmousedown = function(e) {
    e = e || window.event;
    var button = (typeof e.which != "undefined") ? e.which : e.button;
    if (button == 1) {
        alert("Left mouse button down");
    }
};

对于全面的分析,我推荐阅读Jan Wolter关于JavaScript鼠标事件的文章

对于与按键有关的事件,“which”属性关联到被按下的键。对于“keydown”和“keyup”事件,这相对简单:它是所按下按键的键码,并且返回与事件的“keyCode”属性相同的值。由于所有浏览器都支持“keyCode”属性,而IE < 9不支持“which”属性,因此您通常应该在“keydown”和“keyup”事件中使用“keyCode”属性。

对于“keypress”事件,情况更为复杂。对于可打印字符键, “which” 是按下的键的字符代码,并且在比“charCode”属性更多的浏览器中受到支持。在IE < 9中,相当于“which”的是“keyCode”属性。因此,要检测所键入的字符,以下是一种跨浏览器的方法。请注意,下面的代码不应用于非打印键,如箭头键,您应该在“keydown”事件中进行检测。

document.onkeypress = function(e) {
    e = e || window.event;
    var charCode = (typeof e.which == "number") ? e.which : e.keyCode;
    if (charCode) {
        alert("Character typed: " + String.fromCharCode(charCode));
    }
};

我建议查看Jan Wolter关于JavaScript按键事件的文章以获取更多详细信息。


5
接受的答案可能在我发布我的答案前几个小时就已经发布并被接受了。 - Tim Down
3
OP没有接受这个答案,让_Tim失望_了! :) - sohaiby

71

e.which不是一个事件,whichevent对象的属性,大多数人在其事件处理程序中将其标记为e。它包含触发事件(例如:keydown,keyup)时按下的键的键码。

document.onkeypress = function(myEvent) { // doesn't have to be "e"
    console.log(myEvent.which);
};

使用这段代码,控制台将打印出您在键盘上按下的任何键的代码。

废弃通知(截至2020年9月)

KeyboardEvent.which已被弃用。请寻找替代方案,例如KeyboardEvent.key。阅读完整API here

1
它并不真正需要Firebug,只需要一些类似console.log的东西(许多比Firebug提供的更多,例如webkitt-ens)。 - npup
1
which 也存在于鼠标事件中,而且你的示例在IE上不起作用,在IE中,事件处理程序不会接收事件参数。 - Tim Down
3
这只是另一个帮助所有人的提示(可能也会在其他e.which问题上发布)。我在jQuery论坛上发布了一个帖子,列出了大多数e.which代码及其相关键。帖子在这里-> http://forum.jquery.com/topic/eventwhich-code-list-just-for-help - SpYk3HH
KeyboardEvent.which已被弃用,请寻找替代方案,例如KeyboardEvent.key。更多信息请参见此处 - crimson_king

12

这个功能已从Web标准中移除。尽管某些浏览器仍可能支持该功能,但正在逐步停用该功能。请勿在新旧项目中使用它。使用该功能的页面或Web应用程序可能随时出现问题。

如果有可用的话,应改用KeyboardEvent.key代替。

http://codepen.io/KevinOrfas/pen/QKbKAd


4
KeyboardEvent.key将返回键的标识符(字符),而KeyboardEvent.which将返回数字keyCode。 - csr-nontol
1
请注意,IE11和Edge18不一致地实现了规范 - Ian Dunn

7

在一个事件中,e

e.which

等同于:

e.keyCode

因此,这两个函数都允许您在keypress、keydown或keyup事件期间获取按键的键码。

许多人使用||(或)来确保其代码在不支持哪个属性的浏览器中正常工作。请查看下面的代码:

document.onkeypress = function(e) {
   var key = e.which || e.keyCode;
   alert(key);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接