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 中,像 tab、arrows 和 backspace[=46= 这样的键] 甚至没有触发侦听器,像 v 和 c 这样的按键在与 一起使用时也不会触发它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();
})
我们来看看官方文档:
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 文档对按键的描述:
点击几下后,我们在 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);
我的一个页面上有一个输入,上面有侦听器,可以对输入的值执行格式化。
该字段只允许某些输入(数字以及某些其他字符),这是由按键和按键监听器控制的。 keypress 防止非法输入,keyup 执行格式化(并检查输入,以防用户将内容粘贴到字段中而不是键入)。
它在 Chrome 和 IE 中运行良好(回到 IE8,我不关心之前的任何事情),但在 Firefox 中我无法使用 tab 键、箭头 键、退格键,并且无法使用 ctrl+[= 进行复制或粘贴31=]c/v
经过一番调查,我发现问题出在这个监听器上:
$(this).keypress(function(e)
{
consumeIllegalFloatKeyPress(e);
});
在 IE 和 Chrome 中,像 tab、arrows 和 backspace[=46= 这样的键] 甚至没有触发侦听器,像 v 和 c 这样的按键在与 一起使用时也不会触发它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();
})
我们来看看官方文档:
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 文档对按键的描述:
点击几下后,我们在 this page
上看到一个不错的 tabletable 显示哪些浏览器接受某些键,如非原则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);