Скрипт Greasemonkey не может удалить элемент

Большая часть этого скрипта в основном вырезана и вставлена ​​из скриптов других людей, которые работают на них, но у меня возникла странная проблема, когда .remove или .removeChild не запускаются. В этот момент скрипт вылетает из движка пользовательского скрипта.

// ==UserScript==
// @name     Strip Gocomics Sidebar
// @version  1
// @grant    none
// @include  https://www.gocomics.com/*
// ==/UserScript==

window.addEventListener('load', setkillsidebar);

function setkillsidebar() {
  var interval = Math.random() * 5000 + 1000;
  setTimeout(killsidebar, interval);
}

function killsidebar() {
  console.log("Start Session");
  // const adSidebar = document.querySelectorAll('.gc-container-fluid .layout-2col-sidebar, .gc-page-header--hero .layout-2col-sidebar');
  var adSidebar = document.getElementsByClassName('.gc-container-fluid .layout-2col-sidebar, .gc-page-header--hero .layout-2col-sidebar');
  console.log("Got Elements " + adSidebar.length );
  if (adSidebar) {
    console.log("Found SideBar");
    var myParent = adSidebar.parentNode;
    console.log("Made Parent");
    // myParent.remove();
    adSidebar.parentNode.removeChild(adSidebar);
    console.log("Stripped SideBar");
    var interval = Math.random() * 5000 + 1000;
    console.log("Timer Time " + interval );
    setTimeout(killsidebar, interval);
    console.log("Set Timer");
  }
}

Итак, с добавлением элементов console.log я получаю в веб-консоли Firefox следующее:

  • Начать сеанс
  • Получил элементы
  • Найдена боковая панель
  • Сделано родителем

И это обертка, у меня есть смерть либо на .remove, либо на .removeChild, так что либо я что-то делаю неправильно, либо у меня проблема с настройкой безопасности, которая не позволяет мне удалять элементы с веб-страниц, о которых мне никто не сказал. .

И для более интересной информации, хотя заголовок этого поста Greasemonkey, это также не работает с Tampermonkey.

P.S. Это используется в дополнение к некоторому стильному CSS, который позволяет мне иметь более крупный комический вид на маленьком мониторе. Неважно, работает Stylish или нет.


person Colin    schedule 23.05.2018    source источник


Ответы (1)


Есть много проблем с этим пользовательским скриптом, но в основном они сводятся к следующему: вам нужно отметить сообщения об ошибках в консоли и найти в Google функции, которые их вызывают.
Например:

  • getElementsByClassName работает не так.
  • querySelectorAll не возвращает узел.
  • parentNode и removeChild действуют на один узел.

Также: второй setTimeout, похоже, не нужен. И прослушиватель событий load тоже (наверное) лишний.

Вот скрипт с исправленными недостатками:

// ==UserScript==
// @name     Gocomics, Strip Sidebar
// @match    https://www.gocomics.com/*
// @version  2
// @grant    none
// ==/UserScript==

var interval = Math.random () * 5000 + 1000;
setTimeout (killsidebar, interval);

function killsidebar () {
    //-- querySelector() and querySelectorAll () are not the same.
    var adSidebar = document.querySelector ('.gc-container-fluid .layout-2col-sidebar, .gc-page-header--hero .layout-2col-sidebar');
    if (adSidebar) {
        adSidebar.parentNode.removeChild (adSidebar);
    }
}

Хотя этот скрипт, вероятно, будет работать лучше:

// ==UserScript==
// @name     Gocomics, Strip Sidebar
// @match    https://www.gocomics.com/*
// @version  2
// @require  https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// @grant    GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.

waitForKeyElements (
    ".gc-container-fluid .layout-2col-sidebar, .gc-page-header--hero .layout-2col-sidebar",
    removeNode
);

function removeNode (jNode) {
    jNode.remove ();
}

Он использует waitForKeyElements, который быстрее и надежнее, чем прямой setTimeout.

person Brock Adams    schedule 23.05.2018
comment
Ваш первый блок кода удивительно похож на то, что я изначально сделал, и по какой-то причине он не работал должным образом. Вероятно, какая-то задержка загрузки страницы делает ее попаданием или промахом. Теперь ваше второе решение приятно и очень хорошо справляется со своей задачей. Спасибо. - person Colin; 01.06.2018