【问题标题】:Javascript up arrow keypress not firingJavascript向上箭头按键不触发
【发布时间】:2013-02-03 16:07:18
【问题描述】:

我最近一直在做一些 JS 并遇到这个愚蠢的错误,我可以使用 e.keyCode 检测返回键并检查 keyCode == 13 但是当我尝试检查 38(向上箭头)时它永远不会触发.有什么帮助吗?

HTML:

<input type="text" id="TxtMessage" 
       placeholder="Message" onKeyPress="SendMsg(event)" >

Javascript:

function SendMsg(e)
{
var message = document.getElementById("TxtMessage");

if(e.keyCode ==13)
{
    var json = {"message": message.value};
    json = JSON.stringify(json);
    ws.send(json);
    PreviousMessage = message.value;
    message.value = "";
    message.focus();
}
else if(e.keyCode == 38) 
{ 
    message.value = PreviousMessage;
}
}

编辑:通过将 onKeyPress 更改为 onKeyDown 来修复...奇怪。

【问题讨论】:

  • 你想在这里做什么?当你按下 ENTER 和 UP 时会发生什么?
  • 按下 up 时,它将元素的文本设置为上一个发送的消息。但是向上箭头键按下事件没有被触发。我尝试在那里发出警报,但它仍然不起作用

标签: javascript keypress


【解决方案1】:

替换以下行:

if(e.keyCode !=13) return;
if(e.keyCode == 38) { message.value = PreviousMessage; return;  }

对于这个:

var charCode = typeof e.which == "number" ? e.which : e.keyCode;

if(charCode == 38) { message.value = PreviousMessage; return;  }
if(charCode !=13) return;

更新:
我上面的代码在 keypress 事件中使用时仍然不起作用,因为 正确的解决方案 是使用 keydownkeyup 事件来捕捉箭头键。请参阅此处以获取增强的答案https://*.com/a/2218915/352672 另请参阅此处working jsfiddle 使用 keyup 事件。

【讨论】:

    【解决方案2】:

    交换

    if(e.keyCode !=13) return; 
    

    和下一行。

    【讨论】:

    • 你确定?也许问题出在其他地方? “不起作用”是指 message.value 设置不正确?
    • 是的,我也一直在使用警报来仔细检查它是否在触发。永远不会显示警报。
    【解决方案3】:

    使用这个:

    function SendMsg(e)
    {
        var message = document.getElementById("TxtMessage");
    
        // Load previous message
        if(e.keyCode == 38) { message.value = PreviousMessage; return;  }
    
    
        // Send message on ENTER
        if(e.keyCode == 13) {
            if(message.value !=null && message.value !="")
            {
                var json = {"message": message.value};
                json = JSON.stringify(json);
                ws.send(json);
                PreviousMessage = message.value;
                message.value = "";
                message.focus();
            }
            else
            {
                CAlert("Message cannot be empty.", false, true);    
            }
        }
    }
    

    更新为什么 keyDown 有效而 keyPress 无效?

    请注意,keydown 和 keyup 提供了一个代码来指示哪个键是 按下,而 keypress 指示输入了哪个字符。为了 例如,小写的“a”会被 keydown 和 keyup 报告为 65, 但按按键为 97。大写的“A”被所有人报告为 65 事件。由于这种区别,当捕捉特殊击键时 如方向键,.keydown() 或 .keyup() 是更好的选择。

    简而言之,keyPress 事件不会针对箭头键触发。

    【讨论】:

    • 我需要检查一下,它确保只有在按下回车键而不是其他键时才会发送消息。我尝试完全删除 13 的检查并且只使用 e.keyCode == 38 并且我在 { 内放置了一个警报但它仍然没有触发......
    • 刚刚将原始帖子中的 Javascript 更新为我的新帖子,但仍然无法正常工作并修复了您要说的问题。