greasemonkey: остановить запуск встроенного JS - PullRequest
5 голосов
/ 15 июля 2010

На странице есть следующее в html:

<script type="text/javascript">
  // some code
</script>

Мой скрипт greasemonkey должен предотвратить запуск этого скрипта .Как я могу это сделать?


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

<script type="text/javascript">
  if (!window.devicePixelRatio) {
    // some code that I -don't- want to be run, regardless of the browser
  }
</script>

Есть ли способ определить window.devicePixelRatio до запуска встроенного скрипта?

Ответы [ 4 ]

13 голосов
/ 27 сентября 2013

Теперь это возможно с @run-at document-start и Firefox's beforescriptexecute. Проверено только в FF24.

// ==UserScript==
...
// @run-at         document-start
// ==/UserScript==

//a search string to uniquely identify the script
//for example, an anti-adblock script
var re = /adblock/i;

window.addEventListener('beforescriptexecute', function(e) {

    if(re.test(e.target.text)){

        e.stopPropagation();
        e.preventDefault();
    }

}, true);

beforescriptexecute было отклонено для HTML 5 в 2016 году, и Chrome вряд ли сможет его реализовать .

Он не работает для <script> узлов, вставленных другими скриптами.

2 голосов
/ 15 июля 2010

Пользовательские сценарии запускаются после загрузки страницы, поэтому вы не можете.

Если код не использует событие "onload".

Пользовательские сценарии выполняютсяпосле полной загрузки DOM, но до того, как произойдет загрузка.Это означает, что ваши сценарии могут начаться немедленно и не должны ждать загрузки.

1 голос
/ 29 сентября 2013

Re:

Есть ли способ определить window.devicePixelRatio до запуска встроенного сценария?

Есть сейчас.Например:

// ==UserScript==
// @name     _Pre set devicePixelRatio
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @run-at   document-start
// @grant    none
// ==/UserScript==
//-- @grant none is imporatant in this case.

window.devicePixelRatio = "Unimportant string or function or whatever";


В общем случае:

Начиная с версии 4 Firefox, это теперь возможно только в Firefox.Используйте утилиту checkForBadJavascripts , чтобы использовать силу beforescriptexecute.Вот так:

// ==UserScript==
// @name     _Block select inline JS
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  https://gist.github.com/raw/2620135/checkForBadJavascripts.js
// @run-at   document-start
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

checkForBadJavascripts ( [
    [false, /window\.devicePixelRatio/, null]
] );


Блокирует первый встроенный скрипт, который содержит window.devicePixelRatio, полностью .Если вы хотите выборочно изменить части этого сценария, см. этот ответ и / или этот ответ .

1 голос
/ 01 февраля 2011

Другой вариант - использовать Privoxy вместо GreaseMonkey.Вы просто используете Privoxy в качестве прокси (на локальном хосте) и ищите / заменяете строки, которые вам не нравятся.

...