Скрипт Greasemonkey для отключения надоедливых вещей - PullRequest
4 голосов
/ 23 декабря 2010

Можно ли использовать Greasemonkey для выборочного удаления сценариев на сайте?

Отказ от ответственности: я знаю JS, но не имею большого опыта (читай: нет) с GM.

Мне просто нужно остановить загрузку внешних скриптов (не могу использовать NoScript, потому что я хочу загружать другие менее раздражающие скрипты).

Я пытался сделать это:

// ==UserScript==
// @name           turn_shit_off
// @namespace      http://www.google.com
// @include        http://www.xyz.com/*
// ==/UserScript==

window.onload = function() {
    var d = document;   // shorthand
    var scripts = d.getElementsByTagName('script');
    for(var i = 0; i < scripts.count; i++) {
        if(scripts[i].src.indexOf('foobar.js') != -1) {
            scripts[i].src = '';
        }
    }
}

Но у меня это не работает.

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Да, Adblock Plus - лучший способ, если применимо.

Код GM может не срабатывать вовремя, чтобы остановить весь ущерб, но - для хихиканья - рабочая версия вашего кода будет выглядеть примерно так:

// ==UserScript==
// @name           turn_shit_off
// @namespace      http://www.google.com
// @include        http://www.xyz.com/*
// ==/UserScript==

var scripts = document.getElementsByTagName('script');

for (var J = scripts.length-1;  J >=0;  --J)
{
    if (/foobar\.js/i.test (scripts[J].src) )
    {
        console.log ("Killed", scripts[J].src);
        scripts[J].parentNode.removeChild (scripts[J]);        
    }
}

/*--- Now you have to unload any unwanted event handlers and/or timers 
    that were set before the above code could fire.
    This is highly page-specific and may not be possible if anonymous
    functions were used.
*/


Вы увидите, что он на самом деле удаляет элементы сценария.
Но, увы, изменение или удаление элементов script само по себе не даст эффекта в большинстве случаев.За исключением может в коде с отложенной загрузкой / запуском (вещи, которые запускают onload или имеют атрибуты defer или async).

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

Запустите этот код, чтобы убедиться в этом сами.

0 голосов
/ 23 ноября 2014

Вот еще более короткий от Мэтта Сарджента на форуме Greasemonkey:

var badWidget = document.getElementById('challengeWinnersWidget');
badWidget.parentNode.removeChild(badWidget);

Простой, элегантный, эффективный!

...