JavaScript检测鼠标抬起时控制键是否按下

19

我已经进行了大量搜索,但似乎找不到令人满意的解决方案。希望有人能够帮忙。

虽然我正在使用jQuery,但我还编写了许多千行级别的JavaScript代码。因此,“纯”JavaScript解决方案也可以。

我正在尝试确定在mouseup事件上是否实际按下了控制键。就是这样,没有其他前提条件。 有谁知道如何可靠地跨浏览器完成这个任务吗?

我已经尝试通过记录按下和释放键时的状态变量来存储它:

// BEGIN store control key status in hash_state
$().bind('keydown','ctrl',function( arg_obj_e ){
  hash_state.sw_ctrldn = true;
  console.debug( hash_state.sw_ctrldn );
});
$().bind('keyup','ctrl',function( arg_obj_e ){
  hash_state.sw_ctrldn = false;
  console.debug( hash_state.sw_ctrldn );
});
// END store control key status in hash_state

然而,这个方法并不奏效。如果你使用Firebug测试并观察控制台,你会发现自动重复好像发生了,值也会切换。

我检查了mouseup事件,看看那里是否有任何有用的信息,但没有发现:

var debugEvent = function( arg_obj_e ){
  var str = '';
  for ( var attr in arg_obj_e ){
    str += attr + ': ' + arg_obj_e[attr] + '\n';
  }
  console.debug(str);
}
任何帮助都将不胜感激。

哇,我不知道jQuery支持那种键盘事件。我找不到任何相关的文档。另外,$().bind()(空的jQuery)能用吗,还是只是简写?如果可以,它是绑定到$(document)吗? - eyelidlessness
@eyelidlessness:那种绑定是来自一个叫做js-hotkeys的插件 http://code.google.com/p/js-hotkeys/ - Christian C. Salvadó
这也行不通,因为如果用户使用Ctrl+F搜索页面,则在他们松开Ctrl键时,查找窗口会获得焦点,因此不会触发Ctrl(或F)的keyup事件。另外,如果您需要跟踪F键,那么之后您将永远认为它是按下状态,我没有解决方案。 - Curtis
1个回答

36
你可以使用 event.ctrlKey 属性。
$(function(){
  $('#elementId').mouseup(function(e){
    var isCtrlPressed = e.ctrlKey;
    // true or false whether ctrl is pressed or not 
  });
});

可以在这里查看运行示例


哇,我在事件调试期间正在寻找那个属性,可能错过了它。谢谢!在FF3上运行得很好;现在看看IE如何。 - Michael Mikowski
不客气,Michael。这些关键修饰符(shiftKey、ctrlKey、altKey)是在2000年后期引入的DOM Level 2标准(http://is.gd/1Vryp),并且自IE6以来就得到支持。 - Christian C. Salvadó
更好的是!我也想在我的应用程序中使用shiftKey和altKey。我刚刚发现,在Firefox中,ctrl-mousewheel默认为文本缩放,这可能会让我的用户感到困扰。也许最好使用其他键 :)似乎必须在查询时激活这些属性,因为仅迭代事件对象的属性并没有给我任何东西,如果我没记错的话。再次感谢。节省了我很多麻烦。 - Michael Mikowski
属性可能在原型链中。 - Josiah

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