Как вызвать исходную функцию JavaScript, которая сначала была переопределена расширением?

1

Там расширение Firefox, которое модифицирует функцию preventDefault

Object.defineProperty(Event.prototype, 'preventDefault', ...

перед выполнением скрипта JavaScript. Поэтому, когда я preventDefault функцию preventDefault, вместо исходной будет вызываться измененная функция. Поведение функции изменяется расширением.

Для меня существует два способа обойти расширение:

  1. Получите собственную функцию preventDefault перед выполнением расширения, но мой скрипт всегда выполняется после расширения, даже я поместил свой скрипт в главный тег.

  2. Внедрите функцию preventDefault самостоятельно, но я не знаю, как это сделать.

Или это несколько альтернативных способов?

Теги:
firefox
preventdefault
firefox-webextensions
eventhandler

1 ответ

0
Лучший ответ
  1. Получите собственную функцию preventDefault перед выполнением расширения, но мой скрипт всегда выполняется после расширения, даже я поместил свой скрипт в главный тег.

Это невозможно. Расширение было выбрано для запуска до загрузки вашего HTML (т.е. Расширение выполняется в document_start). Если вы захотите, вы можете запустить код сначала. Это так, как браузер разработан/предназначен. Если расширение изменяет прототип, у вас не будет прямого доступа к функции, которая была переопределена.

  1. Внедрите функцию preventDefault самостоятельно, но я не знаю, как это сделать.

В принципе, вы не можете. Метод .preventDefault() - это способ, которым вы можете повлиять на внутреннюю структуру данных браузера, которая представляет событие таким образом, чтобы браузер не вызывал действие по умолчанию. Даже удаление элемента из DOM не будет препятствовать действию по умолчанию. Нет никакого способа повлиять на то, будет ли выполняться действие по умолчанию или нет, кроме вызова .preventDefault().

Все, что вы можете сделать, это обнаружить, что метод .preventDefault() был переопределен и предупреждает пользователя о том, что ваш сайт не работает должным образом с установленным/активным расширением. В этом случае вы могли бы, вероятно, обнаружить, что метод .preventDefault() был изменен путем сравнения того, что возвращается Event.prototype.preventDefault.toString() к ожидаемому возврату, когда метод не был переопределен.

  • 0
    Я действительно согласен с вами, чтобы обнаружить, если метод переопределен. На самом деле мы можем напрямую определить расширение простым способом, поскольку оно также изменило некоторые другие стандартные поведения javascript.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню