Vanilla JavaScript:禁用整个网站中的所有关键组合

Posted

技术标签:

【中文标题】Vanilla JavaScript:禁用整个网站中的所有关键组合【英文标题】:Vanilla JavaScript: Disable all key combos whatsoever in an entire website 【发布时间】:2019-03-26 11:50:38 【问题描述】:

有时当您使用网站时,它们包含一个或多个键盘组合或(“键盘快捷键”),例如 Alt+Shift+SCTRL+Shift+D从某种角度来看,是该网站(或该网站中的一个或多个网页)所独有的。

一个很好的广泛示例是当您在 Wikipedia 中的 edit-page of a random user-page 中时获得的不同组合键(将鼠标放在一个选项上通常会显示描述其组合键的链接描述)。

可能的问题

有时,网站的一组组合键可能会与给定操作系统的组合键发生冲突(如果组合键用于罕见错误,甚至会导致编辑错误)。

我的问题

是否有一种“暴力”(和普通的)javascript 方式来禁用整个网站中的所有预先存在的组合键?不仅仅是一两个预先存在的(特定)键组合,而是所有组合键,一次完成?

也许某种for 循环可以做到这一点?

我可以在诸如 Greasemonkey 或 Tampermonkey 之类的浏览器脚本执行器中运行此代码。

我为什么要问这个问题:

在我个人提出的this question 和this question 中找到“令人满意”的答案后,我提出了这个问题,其中包含我迄今为止尝试过的各种代码。

重要提示:

一般来说,我不认为任何人都应该这样做(也不要强加于其他人),因为它减少了 Web Accessibility 的网络应用程序;我描述的问题很少见,涉及我的个人问题。

【问题讨论】:

我不知道,但我给了你一个好评,因为你把这个问题写得这么好。 我也是这样做的。你很少看到写得很好的问题,绝对值得支持 【参考方案1】:

我想我会尝试通过the method described here 阻止事件侦听器。

window.addEventListener("keydown",  function (e)  e.stopPropagation(); , true);
window.addEventListener("keyup",    function (e)  e.stopPropagation(); , true);
window.addEventListener("keypress", function (e)  e.stopPropagation(); , true);

这将阻止所有听众观看任何按键。如果这太宽泛了,您可以添加一些逻辑来仅在持有修饰键时才停止传播,例如

if (e.ctrlKey) 
  e.stopPropagation();

编辑:

上面的代码在我用于测试的页面上有效,但在您的***讨论页上无效,因为 wiki 页面实际上并没有使用事件侦听器,而是使用了 accesskey 属性。在这种情况下,删除属性将删除键盘快捷键:

document.querySelectorAll("[accesskey]").forEach(function(el) 
  el.removeAttribute('accesskey');
);

【讨论】:

哇!我以前在 JavaScript 中从未听说过这个概念。我认为它与 Web Accessibility 有关,并且可能是一个新概念。我会尝试阅读它。亲爱的丹,我非常感谢你的帮助!!!

以上是关于Vanilla JavaScript:禁用整个网站中的所有关键组合的主要内容,如果未能解决你的问题,请参考以下文章

从 jQuery 或 vanilla javascript 事件触发合成 ExtJS 事件

javascript 使用vanilla JavaScript爬上DOM树

javascript 我的vanilla JavaScript插件的入门模板。

javascript 使用Vanilla JavaScript Shopify GraphQL Storefront API

javascript 使用Vanilla JavaScript Shopify GraphQL Storefront API

javascript AJAX与Vanilla JS