Существует как минимум 3 подхода:
- Используйте пользовательскую песочницу .Увы, в настоящее время это работает только на Greasemonkey (включая версию 4+) из-за недостатков / ошибок в дизайне Tampermonkey и Violentmonkey.Подробнее ниже.
- Использование
@run-at document-start
.За исключением того, что это также не будет работать на быстрых страницах. - Удалить переопределение функции .Это обычно работает, но подвержено большему вмешательству с / с целевой страницы.и может быть заблокировано, если страница изменяет
prototype
функции.
См. также Остановите выполнение функции Javascript (на стороне клиента) или настройте ее
Обратите внимание, что все приведенные ниже примеры сценариев и расширений представляют собой полный рабочий код .
И вы можете проверить их по эту страницу корзины JS , изменив:
*://YOUR_SERVER.COM/YOUR_PATH/*
на:
https://output.jsbin.com/kobegen*
Пользовательская песочница:
Это предпочтительный метод, который работает в Firefox + Greasemonkey (включая Greasemonkey 4).
Если для @grant
установлено значение, отличное от none, обработчик сценариев должен запускатьсяскрипт в песочнице, который браузеры специально предоставляют для этой цели.
В нужной песочнице целевая страница может переопределять document.querySelectorAll
или другие собственные функции, какие только пожелает, и пользовательский скрипт будет видеть свои собственные, полностью нетронутые экземпляры , независимо от того.
Это должно всегда работать:
// ==UserScript==
// @name _Unoverride built in functions
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
console.log ("document.querySelectorAll: ", document.querySelectorAll);
и давать:
document.querySelectorAll: function querySelectorAll () {[собственный код]}
Тем не менее, и Tampermonkey, и Violentmonkey не работают в «песочнице» должным образом , ни в Chrome, ни в Firefox.
Целевая страница может вмешиваться в собственные функции, которые видит скрипт Tampermonkey, даже еслиВерсия песочницы Tampermonkey или Violentmonkey.
Это не просто недостаток дизайна, это недостаток безопасности и вектор для потенциальных эксплойтов.
Мы знаем, что Firefox и Chromeне являются виновниками, поскольку (1) Greasemonkey-4 правильно устанавливает песочницу и (2) расширение Chrome правильно устанавливает «Изолированный мир».То есть это расширение:
manifest.json:
{
"manifest_version": 2,
"content_scripts": [ {
"js": [ "Unoverride.js" ],
"matches": [ "*://YOUR_SERVER.COM/YOUR_PATH/*" ]
} ],
"description": "Unbuggers native function",
"name": "Native function restore slash use",
"version": "1"
}
Unoverride.js:
console.log ("document.querySelectorAll: ", document.querySelectorAll);
Выходные данные:
document.querySelectorAll: функция querySelectorAll () {[собственный код]}
в порядке.
Использование @run-at document-start
:
Теоретически, запуск сценария на document-start
должен позволить сценарию перехватить нативную функцию до ее изменения.
EG:
// ==UserScript==
// @name _Unoverride built in functions
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @grant none
// @run-at document-start
// ==/UserScript==
console.log ("document.querySelectorAll: ", document.querySelectorAll);
И это иногда работает на достаточно медленных страницах и / или сетях.
Но, как уже отмечалось в OP, ни Tampermonkey, ни Violentmonkey фактически не вводят и не запускают перед любым другим кодом страницы , поэтому этот метод не работает на быстрых страницах.скрипт содержимого с расширением Chrome, установленный в манифесте с "run_at": "document_start"
, работает в правильное время и / или достаточно быстро.
Удалите переопределение функции:
Если страница (мягко) переопределяет такую функцию, как document.querySelectorAll
, вы можете отменить переопределение, используя delete
, например:
// ==UserScript==
// @name _Unoverride built in functions
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @grant none
// ==/UserScript==
delete document.querySelectorAll;
console.log ("document.querySelectorAll: ", document.querySelectorAll);
, что приводит к:
document.querySelectorAll: функция querySelectorAll () {[собственный код]}
Недостатки:
- Не будет работатьесли страница изменяет прототип.Например:
Document.prototype.querySelectorAll = null;
- На странице могут отображаться или переделываться такие изменения, особенно если ваш сценарий тоже запускается скоро .
Смягчить элемент 2 с помощьюсоздание личной копии:
// ==UserScript==
// @name _Unoverride built in functions
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @grant none
// ==/UserScript==
var foobarFunc = document.querySelectorAll;
delete document.querySelectorAll;
var _goodfunc = document.querySelectorAll;
var goodfunc = function (params) {return _goodfunc.call (document, params); };
console.log (`goodfunc ("body"): `, goodfunc("body") );
, что приводит к:
goodfunc ("body"): NodeList 1 0: тело, длина: 1 ,...
И goodfunc()
продолжит работать (для вашего скрипта), даже если страница будет удалена document.querySelectorAll
.