禁止到处使用 .preventDefault()
Disallow .preventDefault() everywhere
我正在尝试编写一个用户脚本来全局阻止所有 .preventDeault()
键盘事件调用,并使用我自己的热键而不是被迫使用不同网站定义的热键。问题是我不知道如何在不查看具体网站代码的情况下解除绑定。我不想阻止所有 JS - 只是那些应该在我的控制下而不是开发人员的控制下的东西 - 但我不明白如何让它变得简单和全球化。
在网站代码中禁用防止默认设置的功能可能会使该网站不稳定甚至无法使用。
您可以在 KeyboardEvent
上创建 preventDefault
的覆盖(它是 UIEvent
的子类,它是 Event
的子类,其中标准 preventDefault
已实现),像这样:
KeyboardEvent.prototype.preventDefault = function() { };
(Event
的 preventDefault
上的 writable
、enumerable
和 configurable
标志都是 true
,所以不需要对于 Object.defineProperty
这里。)
示例:
KeyboardEvent.prototype.preventDefault = function() { };
// This event handler *should* prevent typing in the input, but doesn't because we've broken preventDefault
document.getElementById("the-input").addEventListener("keydown", function(e) {
e.preventDefault();
}, false);
<input id="the-input" type="text">
将其与未覆盖 preventDefault
的版本进行比较:
// This event handler prevents typing in the input, because we haven't broken preventDefault
document.getElementById("the-input").addEventListener("keydown", function(e) {
e.preventDefault();
}, false);
<input id="the-input" type="text">
这可能有效,至少对于现代浏览器的一个子集,但我再次强烈建议不要这样做。
我正在尝试编写一个用户脚本来全局阻止所有 .preventDeault()
键盘事件调用,并使用我自己的热键而不是被迫使用不同网站定义的热键。问题是我不知道如何在不查看具体网站代码的情况下解除绑定。我不想阻止所有 JS - 只是那些应该在我的控制下而不是开发人员的控制下的东西 - 但我不明白如何让它变得简单和全球化。
在网站代码中禁用防止默认设置的功能可能会使该网站不稳定甚至无法使用。
您可以在 KeyboardEvent
上创建 preventDefault
的覆盖(它是 UIEvent
的子类,它是 Event
的子类,其中标准 preventDefault
已实现),像这样:
KeyboardEvent.prototype.preventDefault = function() { };
(Event
的 preventDefault
上的 writable
、enumerable
和 configurable
标志都是 true
,所以不需要对于 Object.defineProperty
这里。)
示例:
KeyboardEvent.prototype.preventDefault = function() { };
// This event handler *should* prevent typing in the input, but doesn't because we've broken preventDefault
document.getElementById("the-input").addEventListener("keydown", function(e) {
e.preventDefault();
}, false);
<input id="the-input" type="text">
将其与未覆盖 preventDefault
的版本进行比较:
// This event handler prevents typing in the input, because we haven't broken preventDefault
document.getElementById("the-input").addEventListener("keydown", function(e) {
e.preventDefault();
}, false);
<input id="the-input" type="text">
这可能有效,至少对于现代浏览器的一个子集,但我再次强烈建议不要这样做。