我正在制作镀铬扩展,偶尔会阻止所有键盘输入暂时到达网页(因为扩展程序的处理程序使用它捕获的键盘输入执行自己的任务)。并且扩展程序可以很好地收听所有这些输入。
然而,一些键盘输入仍然通过网页!具体来说,使用Alt修饰键的某些键盘输入会到达网页。我用这段代码复制了这个问题:
$(window).get(0).addEventListener("keypress",
function(e){
e.stopPropagation();
e.preventDefault();
}, true);
您可以与此jsfiddle中的代码进行互动:https://jsfiddle.net/Sophtware/5ucefew2/
有人可以帮我弄清楚为什么会这样,以及如何解决它?
编辑#1:我发现通过preventDefault调用的符号是重音或其他“组合字符”(如',,¨)。实际上,一旦输入了组合字符,输入的下一个字符也将始终无法被阻止。答案 0 :(得分:2)
好吧,首先,你没有在你的小提琴中加载jQuery。
其次,您需要使用keydown
事件,而不是keypress
,因为当按下不产生可见字符的键时keypress
不会触发。这就是为什么你发现某些角色使用它而其他角色没有。
第三,您的事件绑定代码并未真正正确编写。当jQuery返回仅包含一个项目的包装集时,无需使用get(0)
。由于只有一个window
或document
,因此不需要该代码。
此外,您可以明确检查正在按下的ALT键。
最后,请不要将您的代码发布到第三方网站,因为这些链接会随着时间的推移而中断。而是在此处发布您的代码段。
见内联评论:
// Set the event on the document, but then test for the input element when it happens
$(document).on("keydown", "input[type='text']", function(e){
// Check the event for the ALT key press
console.log("Keystroke cancelled!");
e.preventDefault();
e.stopPropagation();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h3>
Type in Alt + 'e', Alt + 'i', or other Alt combinations! They get typed in even though they're not supposed to!
</h3>
<p>
Strangely, Alt+j and Alt+k cannot be written more than once in a row and act strange in general.
If you type in Alt + e and then a regular letter key press, the letter gets typed! ??????
</p>
<input type="text">