Запрещать .preventDefault () везде - PullRequest
       12

Запрещать .preventDefault () везде

0 голосов
/ 09 сентября 2018

Я пытаюсь написать пользовательский скрипт, чтобы блокировать все вызовы .preventDeault() в глобальном масштабе для событий клавиатуры и использовать мои собственные горячие клавиши вместо того, чтобы использовать те, которые определены на разных веб-сайтах. Проблема в том, что я не могу понять, как можно развязать что-то подобное, не заглядывая в код конкретного веб-сайта. Я не хочу блокировать все JS - только то, что должно быть под моим контролем, а не разработчиками - но я не понимаю, как сделать его простым и глобальным.

1 Ответ

0 голосов
/ 09 сентября 2018

Отключение возможности запретить использование по умолчанию в коде веб-сайта может сделать этот сайт нестабильным и, возможно, непригодным для использования.

Вы можете создать переопределение preventDefault для KeyboardEvent (который является подклассом UIEvent, который является подклассом Event, где реализован стандарт preventDefault), например:

KeyboardEvent.prototype.preventDefault = function() { };

(Флаги writable, enumerable и configurable на Event *1014* все 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">

Это может сработать, по крайней мере, для подмножества современных браузеров, но опять же, я настоятельно рекомендую против этого.

...