preventDefault不会阻止使用Alt修饰符的键

时间:2017-07-18 20:11:27

标签: javascript jquery google-chrome google-chrome-extension

我正在制作镀铬扩展,偶尔会阻止所有键盘输入暂时到达网页(因为扩展程序的处理程序使用它捕获的键盘输入执行自己的任务)。并且扩展程序可以很好地收听所有这些输入。

然而,一些键盘输入仍然通过网页!具体来说,使用Alt修饰键的某些键盘输入会到达网页。我用这段代码复制了这个问题:

$(window).get(0).addEventListener("keypress",
    function(e){
        e.stopPropagation();
        e.preventDefault();
}, true);

您可以与此jsfiddle中的代码进行互动:https://jsfiddle.net/Sophtware/5ucefew2/

有人可以帮我弄清楚为什么会这样,以及如何解决它?

编辑#1:我发现通过preventDefault调用的符号是重音或其他“组合字符”(如',,¨)。实际上,一旦输入了组合字符,输入的下一个字符也将始终无法被阻止。

1 个答案:

答案 0 :(得分:2)

好吧,首先,你没有在你的小提琴中加载jQuery。

其次,您需要使用keydown事件,而不是keypress,因为当按下不产生可见字符的键时keypress不会触发。这就是为什么你发现某些角色使用它而其他角色没有。

第三,您的事件绑定代码并未真正正确编写。当jQuery返回仅包含一个项目的包装集时,无需使用get(0)。由于只有一个windowdocument,因此不需要该代码。

此外,您可以明确检查正在按下的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">