Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按键并同时单击_Javascript_Jquery - Fatal编程技术网

Javascript 按键并同时单击

Javascript 按键并同时单击,javascript,jquery,Javascript,Jquery,如何合并按键和点击?我的意思是,当用户按enter键并同时单击某个位置时,我需要调用一个函数 $(document).keypress(function(e) { var code = e.keyCode || e.which; if(code == 13) { alert('keypress'); } }); $(document).on( "click", function() { alert('click'); }); 我有这段代码,但我无

如何合并按键和点击?我的意思是,当用户按enter键并同时单击某个位置时,我需要调用一个函数

$(document).keypress(function(e) {
    var code = e.keyCode || e.which;
    if(code == 13) {
        alert('keypress');
    }
});
$(document).on( "click", function() {
    alert('click');
});

我有这段代码,但我无法合并它(通常我不使用jQuery/javascript)。

类似的东西可能会起作用

var pressingEnter = false;
$(document).on({
    keydown: function(e) {
        if(e.which == 13) {
            // enter is being pressed, set true to flag variable
            pressingEnter = true;
        }
    },
    keyup: function(e) {
        if(e.which == 13) {
            // enter is no longer pressed, set false to flag variable
            pressingEnter = false;
        }
    },
    click: function() {
        if (pressingEnter) {
           console.log('click and enter pressed');
        }
    }
});
顺便说一句:没有必要做
var code=e.keyCode | e.which因为jQuery为您解决了这个问题。您可以在任何浏览器上使用
e.which

编辑

此版本应允许任何顺序的按键/鼠标单击。我假设只捕获了左键单击。处理enter+鼠标单击的逻辑被放置在
keydown
mousedown
(如果更有意义,可以将其移动到
keydup
mouseup

自第一次阻止触发
mouseup
事件以来,
console.log更改了
alert
。现在,我们有上百种比内置警报弹出窗口更好的方式向用户显示消息,所以我假设这不是一个要求

var pressingEnter = false;
var clickingMouseButton = false;
$(document).on({
    keydown: function(e) {
        if(e.which == 13) {
            pressingEnter = true;
        }

        if (clickAndEnterPressing()) {
            console.log('click and enter pressed');
        }        
    },
    keyup: function(e) {
        if(e.which == 13) {
            pressingEnter = false;
        }
    },
    mousedown: function(e) {
        if (e.which == 1) {
            clickingMouseButton = true;
        }

        if (clickAndEnterPressing()) {
            console.log('click and enter pressed');
        }           
    },
    mouseup: function(e) {
        if (e.which == 1) {
            clickingMouseButton = false;
        }
    }
});

function clickAndEnterPressing() {
    return pressingEnter && clickingMouseButton;
}

无法“合并”事件。但是,您可以使用例如您的处理程序。例如(使用):


您可以使用event.type确定触发事件的原因

$(function(){
    $(document).on("click", ClickAndKeyPress);

  $(document).on("keypress", ClickAndKeyPress);
});


function ClickAndKeyPress(event){
  $("div").text(event.type);
}

下面是一个例子,如果先按enter键,或者先单击鼠标,或者在一定的时间间隔内同时按两个键(我将其设置为100毫秒,但这很容易调整):

var enterDown=false;
var mouseDown=false;
var lastEnter=false;
var lastMouseUp=false;
var triggerOnNextUp=false;
$(文件)({
向下键:功能(e){
enterDown=true;
},
键控:功能(e){
如果(e.which==13){
lastEnter=(新日期()).getTime();
enterDown=false;
detectEnterAndClick();
如果(鼠标向下){
triggerOnNextUp=true;
}
}
},
mousedown:function(){
mouseDown=true;
},
mouseup:function(){
lastMouseUp=(新日期()).getTime();
mouseDown=false;
detectEnterAndClick();
如果(向下输入){
triggerOnNextUp=true;
}
}
});
函数检测器单击(){
if(Math.abs(lastEnter-lastMouseUp)<100 | | triggerOnNextUp){
//重置变量以防止触发两次
triggerOnNextUp=false;
enterDown=false;
mouseDown=false;
lastEnter=false;
lastMouseUp=false;
$(“正文”).append(“单击并按enter键”);
}
}

上查看它,如果是ENTER键,则标记keydown(在keyup上取消标记),并在click handler中检查该标记。有些还直接在单击处理程序中。您的意思是想在按下enter键时对单击作出反应吗?注意,此解决方案需要使用库。如果我错了,请更正我的错误,但它们看起来像两个不同的库。Lodash和下划线具有类似的功能,但有轻微的差异
$(function(){
    $(document).on("click", ClickAndKeyPress);

  $(document).on("keypress", ClickAndKeyPress);
});


function ClickAndKeyPress(event){
  $("div").text(event.type);
}
var enterDown = false;
var mouseDown = false;
var lastEnter = false;
var lastMouseUp = false;

var triggerOnNextUp = false;
$(document).on({
    keydown: function(e) {
        enterDown = true;
    },
    keyup: function(e) {
        if(e.which == 13) {
            lastEnter = (new Date()).getTime();
            enterDown = false;
            detectEnterAndClick();
            if (mouseDown) {
                triggerOnNextUp = true;
            }
        }
    },
    mousedown: function() {
        mouseDown = true;
    },
    mouseup: function() {
        lastMouseUp = (new Date()).getTime();
        mouseDown = false;
        detectEnterAndClick();
        if (enterDown) {
            triggerOnNextUp = true;
        }
    }
});

function detectEnterAndClick() {
    if (Math.abs(lastEnter - lastMouseUp) < 100 || triggerOnNextUp) {
        // Reset variables to prevent from firing twice
        triggerOnNextUp = false;
        enterDown = false;
        mouseDown = false;
        lastEnter = false;
        lastMouseUp = false;

        $("body").append("Clicked and pushed enter<br>");
    }
}