Firefox中奇怪的CTRL键检测

时间:2015-05-20 07:36:50

标签: javascript jquery firefox

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

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

它在Chrome和IE中运行良好(回到IE8,我之前并不关心任何事情),但在Firefox中我无法使用标签键, arrow 键,退格,无法使用 ctrl + c / v <复制或粘贴/ p>

经过一番调查后,我发现问题在于听众:

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

在IE和Chrome中, tab arrows backspace 之类的键甚至没有触发监听器,而且按键如<当与 ctrl 键一起使用时,kbd> v 和 c 也不会触发它。然而,在FF中,它会拾取所有的按键,这导致了 consumeIllegalFloatKeyPress(e); 被叫,并发现按键是非法的。

修复很简单 - 我有一系列合法输入用于检查应该允许什么,所以我只添加了 v c 的charCodes ,并为ctrlKey添加一个密钥。

我感到困惑的是为什么在不同的浏览器中处理这些问题的原因有何不同?我认为,因为它是所有javascript,它将在所有浏览器中处理 CTRL 键。

如果有人有任何关于此的信息,或者知道某个地方我可以阅读更多信息,我会非常感兴趣和感激!

3 个答案:

答案 0 :(得分:2)

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

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);

答案 1 :(得分:1)

让我们来看看官方文档:

jQuery keypress listener

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

  

注意:由于任何官方规范都没有涵盖按键事件,因此使用它时遇到的实际行为可能因浏览器,浏览器版本和平台而异。

  

这个方法是前两个变体中.on(&#34; keypress&#34;,handler)的快捷方式,第三个变种是.trigger(&#34; keypress&#34;)。

让我们看一下Javascript文档中关于keypress的内容:

javascript keypress event

点击几下后,我们会在this page

上看到一个漂亮的表格

该表显示了哪些浏览器接受某些键,例如不可打印的键(箭头键,控制键,向下翻页符......)以及哪些键不接受。

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

答案 2 :(得分:0)

请尝试此解决方案:

export SPARK_WORKER_INSTANCES=4
export SPARK_WORKER_CORES=2
export SPARK_WORKER_MEMORY=4g

...您可以启用或禁用您想要的密钥。

我会给你一个我的功能:

<强>功能:

$(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);
            };
        });
    });
};