2010-03-15 42 views
86

我想用jQuery捕捉一个点击事件,并能够判断是否同时按下了一个键,这样我就可以在基于keypress事件的回调函数内进行分叉。如何在jQuery的点击事件中检查是否按下了某个键?

例如:

$("button").click(function() { 
    if([KEYPRESSED WHILE CLICKED]) { 
     // Do something... 
    } else { 
     // Do something different... 
    } 
}); 

这是不可能的或者是如何,如果有可能能不能做到?

回答

42

你需要使用keydown()keyup()分别跟踪的关键地位:

var ctrlPressed = false; 
$(window).keydown(function(evt) { 
    if (evt.which == 17) { // ctrl 
    ctrlPressed = true; 
    } 
}).keyup(function(evt) { 
    if (evt.which == 17) { // ctrl 
    ctrlPressed = false; 
    } 
}); 

list of key codes。现在你可以检查:

$("button").click(function() { 
    if (ctrlPressed) { 
    // do something 
    } else { 
    // do something else 
    } 
}); 
+5

一个使用JavaScript使用下来,这个方法的侧(不,我知道一个更好的办法)。如果您正在检测ALT键,用户ALT-选项卡另一个窗口,那么浏览器不会检测到键盘事件,因为它发生在另一个应用程序上。从这一点来看,jquery认为关键是关闭,直到他们在你的jQuery应用程序中关闭。 就我所能想象的,这只与ALT键有关。 – Ben 2014-09-25 16:16:26

+1

对于Mac OS X,这将是Cmd-Tab,但我认为校长仍然拥有 – murftown 2016-04-14 16:44:54

+0

或Ctrl + Tab用于更改浏览器的选项卡 – Seeven 2017-09-21 15:29:24

152

你可以很容易地检测事件属性的shift,alt和控制键;

$("button").click(function(evt) { 
    if (evt.ctrlKey) 
    alert('Ctrl down'); 
    if (evt.altKey) 
    alert('Alt down'); 
    // ... 
}); 

有关更多属性,请参阅quirksmode。如果要检测其他密钥,请参阅cletus's answer

+3

我没有在jQuery Event对象上看到该属性:http://api.jquery。 com/category/events/event-object/ – cletus 2010-03-15 07:35:44

+1

那么,就像页面所说的那样,“来自原始事件的大多数属性都被复制并标准化为新的事件对象。” ctrlKey,altKey等是ecmascript标准的一部分(参见前面提到的jquery api页面上的第一个链接),所以(至少在体面的浏览器中)事件对象通常也具有这些属性设置。 – kkyy 2010-03-15 07:43:03

+3

怪癖模式只说这些是在一个关键事件中定义的*。没有提及鼠标事件。 – 2012-09-14 23:39:18

4

我能独自

<a href="" onclick="return Show(event)"></a> 

    function Show(event) { 
      if (event.ctrlKey) { 
       alert('Ctrl down'); 
      } 
    } 
相关问题