2017-07-18 61 views
0

我正在做一个chrome扩展,偶尔会阻止所有键盘输入临时到达网页(因为扩展的处理程序使用它捕获的键盘输入执行自己的任务)。这个扩展功能在听取所有这些输入信息方面做得很好。preventDefault没有阻止使用Alt修饰符的键

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

有人可以帮助我弄清楚为什么发生这种情况,以及如何解决它:

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

您可以在此的jsfiddle代码交互?编辑#1:我发现来自preventDefault调用的符号是类似重音符号或其他“组合字符”(如',,¨)的符号。实际上,一旦输入组合字符,输入的下一个字符将始终无法被阻止。

+0

见我的回答如下为你有几个问题和工作的例子。 –

回答

2

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

其次,您需要使用​​事件,而不是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']", \t 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">

+0

我运行了你的代码,它比我的代码更少的键盘事件。它不会阻止Alt +'e'组合或任何其他Alt组合。它也不会阻止常规按键。再次,我试图让代码阻止所有键盘输入。我的问题是,我的代码只阻止MOST键盘输入。 – Sophtware

+0

@Sophtware你错了。您是否在此处运行了我的代码片段,或者是否将我的代码复制到了您的项目中?同样,你的Fiddle没有包含jQuery,所以没有任何代码运行。我的代码会阻止任何以ALT开头的组合键。我将更新问题以防止所有按键。 –

+0

我点击了“Run code snippet”,然后输入到输入框 +'e'中,输入口音。 – Sophtware