Firefox 中奇怪的 CTRL 键检测

Weird CTRL key detection in Firefox

我的一个页面上有一个输入,上面有侦听器,可以对输入的值执行格式化。

该字段只允许某些输入(数字以及某些其他字符),这是由按键和按键监听器控制的。 keypress 防止非法输入,keyup 执行格式化(并检查输入,以防用户将内容粘贴到字段中而不是键入)。

它在 Chrome 和 IE 中运行良好(回到 IE8,我不关心之前的任何事情),但在 Firefox 中我无法使用 tab 键、箭头 键、退格键,并且无法使用 ctrl+[= 进行复制或粘贴31=]c/v

经过一番调查,我发现问题出在这个监听器上:

$(this).keypress(function(e) { consumeIllegalFloatKeyPress(e); });

在 IE 和 Chrome 中,像 tabarrowsbackspace[=46= 这样的键] 甚至没有触发侦听器,像 vc 这样的按键在与 一起使用时也不会触发它ctrl 键。但是,在 FF 中它会拾取所有按键,这导致 consumeIllegalFloatKeyPress(e); 接到电话,发现按键是非法的。

修复非常简单 - 我有一组合法输入用于检查应该允许的内容,所以我只是为 v 和 [=31 添加了字符代码=]c,并输入 ctrlKey 的密钥。

我感到困惑的是为什么这些在不同的浏览器中处理方式不同?我认为,因为它都是 javascript,它会在所有浏览器中处理相同的 CTRL 键。

如果有人对此有任何信息,或者知道我可以在什么地方阅读更多相关信息,我将非常感兴趣并感激不尽!

请尝试这个解决方案:

$(document).on("keypress", this, function (e) {
    var keycode = (e.keyCode ? e.keyCode : e.which);
    /* Example */
    if (keycode === 27) {
         alert("Escape key");
    }
});

...您可以根据需要启用或禁用按键。

我会给你一个我的功能:

功能:

$.fn.pKey = function (key, callback) {
    var key=key;
    return this.each(function () {
        $(document).on("keypress", this, function (e) {
            var keycode = (e.keyCode ? e.keyCode : e.which);
            if (keycode === key) {
                callback.call(this, e);
            };
        });
    });
};

示例:

$("#my-div").pKey(17,function (e) {
    /* disable CTRL*/
    e.preventDefault();
})

我们来看看官方文档:

jQuery keypress listener

2 件重要的事情可以在这里阅读:

Note: as the keypress event isn't covered by any official specification, the actual behavior encountered when using it may differ across browsers, browser versions, and platforms.

并且:

This method is a shortcut for .on( "keypress", handler ) in the first two variations, and .trigger( "keypress" ) in the third.

让我们看看 Javascript 文档对按键的描述:

javascript keypress event

点击几下后,我们在 this page

上看到一个不错的 table

table 显示哪些浏览器接受某些键,如非原则table 键(箭头键、控制键、向下翻页键,...),哪些不接受。

你的问题的最终答案是:如果某件事没有固定的标准(比如按键事件),那么浏览器就会做他们想做的事。对于 Google chrome 这意味着它允许 CTRL + V,Mozilla Firefox 过滤它。

尝试以下解决方案。这非常适合我的问题

function captureKeyPress(e) {
    var keycode = (e.keyCode ? e.keyCode : e.which);
    var ctrlKeyPressed = e.ctrlKey;
    var key = e.which;
    switch(e.key){
      case "c": //right arrow key
        if (!ctrlKeyPressed) {
          alert('C pressed');
        }
        break;
    }
}

window.addEventListener("keypress", captureKeyPress);