72

我需要知道用户是否正在单击或控制单击 div 元素。我已经看到了有关如何使用事件侦听器进行操作的示例。但是我的代码已经设置到位,并且正在使用元素上的onclick方法。 .

HTML

 <div id='1' onclick='selectMe()'>blah</div>

JS

 function selectMe(){
         //determine if this is a single click, or a cntrol click 
    }

...也很想知道是鼠标左键还是右键单击。

4

9 回答 9

109

在您的处理程序中,检查window.event对象的属性ctrlKey,如下所示:

function selectMe(){
    if (window.event.ctrlKey) {
        //ctrl was held down during the click
    }
}

更新: 上述解决方案依赖于窗口对象的专有属性,可能不应该指望它存在于所有浏览器中。幸运的是,我们现在有一个可以满足我们需求的工作草案,并且根据 MDN,它得到了广泛的支持。例子:

HTML

<span onclick="handler(event)">Click me</span>

JS

function handler(ev) {
  console.log('CTRL pressed during click:', ev.ctrlKey);
}

这同样适用于键盘事件

另请参阅 KeyboardEvent.getModifierState()

于 2013-04-24T11:20:25.387 回答
54

2021 年更新:现在有更好的方法来做到这一点。请务必查看其他答案

我建议在文档上使用 JQuery 的 keyup 和 keydown 方法,因为它规范了事件代码,以制作一个跨浏览器的解决方案。

对于右键单击,您可以使用 oncontextmenu,但要注意它在 IE8 中可能会出现错误。在此处查看兼容性图表:

http://www.quirksmode.org/dom/events/contextmenu.html

<p onclick="selectMe(1)" oncontextmenu="selectMe(2)">Click me</p>

$(document).keydown(function(event){
    if(event.which=="17")
        cntrlIsPressed = true;
});

$(document).keyup(function(){
    cntrlIsPressed = false;
});

var cntrlIsPressed = false;


function selectMe(mouseButton)
{
    if(cntrlIsPressed)
    {
        switch(mouseButton)
        {
            case 1:
                alert("Cntrl +  left click");
                break;
            case 2:
                alert("Cntrl + right click");
                break;
            default:
                break;
        }
    }


}
于 2013-04-24T11:38:05.147 回答
41

因为自从第一次提出这个问题以来已经有好几年了,其他答案已经过时或不完整。

这是使用 jQuery 的现代实现的代码:

$( 'div#1' ).on( 'click', function( event ) {
    if ( event.ctrlKey ) {
        //is ctrl + click
    } else {
        //normal click
    }
} );

至于检测右键单击,这是由另一个用户正确提供的,但我将在此处列出它只是为了将所有内容放在一个地方。

$( 'div#1' ).on( 'contextmenu', function( event ) {
    // right-click handler
} ) ;
于 2017-02-16T06:43:25.930 回答
13

当有鼠标点击时,ctrlKey是事件属性,可以作为 e.ctrlKey 访问。 Look down for example

$("xyz").click(function(e)){
  if(e.ctrlKey){
    //if ctrl key is pressed
  }
  else{
    // if ctrl key is not pressed
  }
}

注意:https ://www.w3schools.com/jsref/event_key_keycode.asp

于 2017-04-27T07:21:17.490 回答
5

试试这个代码,

$('#1').on('mousedown',function(e) {
   if (e.button==0 && e.ctrlKey) {
       alert('is Left Click');
   } else if (e.button==2 && e.ctrlKey){
       alert('is Right Click');
   }
});

抱歉,我添加了e.ctrlKey

于 2015-01-13T10:07:52.440 回答
3

试试这个:

var control = false;
$(document).on('keyup keydown', function(e) {
  control = e.ctrlKey;
});

$('div#1').on('click', function() {
  if (control) {
    // control-click
  } else {
    // single-click
  }
});

并且右键单击会触发一个contextmenu事件,因此:

$('div#1').on('contextmenu', function() {
  // right-click handler
})
于 2013-04-24T11:20:27.597 回答
0

您无法检测到某个键在按下后是否已按下。js中只能监听关键事件。在您的情况下,我建议onclick使用按键事件进行更改,然后通过事件键码检测它是否是控制键,然后您可以添加您的点击事件。

于 2013-04-24T11:20:08.637 回答
0

仅从上面,刚刚编辑,所以它可以马上工作

<script>
    var control = false;
    $(document).on('keyup keydown', function (e) {
        control = e.ctrlKey;
    });

    $(function () {
        $('#1x').on('click', function () {
            if (control) {
                // control-click
                alert("Control+Click");
            } else {
                // single-click
                alert("Single Click");
            }
        });
    }); 

</script>
<p id="1x">Click me</p>
于 2016-07-01T05:19:19.617 回答
-2

纯JavaScript:

var ctrlKeyCode = 17;
var cntrlIsPressed = false;

document.addEventListener('keydown', function(event){
    if(event.which=="17")
        cntrlIsPressed = true;
});

document.addEventListener('keyup', function(){
    if(event.which=="17")
        cntrlIsPressed = true;
});



function selectMe(mouseButton)
{
    if(cntrlIsPressed)
    {
        switch(mouseButton)
        {
            case 1:
                alert("Cntrl +  left click");
                break;
            case 2:
                alert("Cntrl + right click");
                break;
            default:
                break;
        }
    }
}
于 2017-11-09T22:43:09.037 回答