Сценарий Greasemonkey, не удаляющий элемент
Большая часть этого сценария в основном вырезана и вставлена из сценариев других людей, которые работают на них, но у меня возникла странная проблема с .remove
или же .removeChild
не в состоянии бежать. На этом этапе скрипт вылетает из обработчика usercript.
// ==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 следующее:
- Начать сессию
- Получил элементы
- Найдена боковая панель
- Made Parent
И это обертка, у меня есть смерть либо в .remove
или .removeChild
либо я что-то делаю неправильно, либо у меня возникла проблема с настройкой безопасности, которая не позволяет мне удалять элементы с веб-страниц, о которых мне никто не говорил.
И для более интересной информации, хотя название этого поста - Greasemonkey, это также не работает с Tampermonkey.
PS Это используется в дополнение к некоторому Стильному CSS, который позволяет мне иметь больше комического представления на маленьком мониторе. Неважно, работает Стил или нет.
1 ответ
Есть много проблем с этим пользовательским сценарием, но они в основном сводятся к следующему: вам нужно записать сообщения об ошибках в консоли и прогуглить функции, которые их вызывают.
Например:
- Это не так
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
,