Javascript 按键并同时单击
如何合并按键和点击?我的意思是,当用户按enter键并同时单击某个位置时,我需要调用一个函数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'); }); 我有这段代码,但我无
$(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>");
}
}