Greasemonkey 脚本无法删除元素
Greasemonkey Script Failing To Remove Element
这个脚本的很多内容基本上都是从其他人为他们工作的脚本中剪切和粘贴的,但是我遇到了一个奇怪的问题,.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 的 Web 控制台中得到以下内容:
- 开始Session
- 获得元素
- 找到侧边栏
- 取得Parent
到此结束,我在 .remove
或 .removeChild
处死亡,所以要么我没有做正确的事情,要么我的安全设置有问题阻止我从没有人告诉我的网页中删除元素。
关于更多有趣的信息,尽管这个 post 的标题是 Greasemonkey,但 Tampermonkey 也失败了。
P.S。除了一些 Stylish CSS 之外,还使用了它,使我可以在小显示器上看到更大的漫画视图。 Stylish 是否 运行ning 并不重要。
该用户脚本有很多问题,但它们主要归结为:您需要注意控制台中的错误消息和 google 导致这些错误的函数。
例如:
- 那不是
getElementsByClassName
的工作方式。
querySelectorAll
没有 return 节点。
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
.
更快更稳健
这个脚本的很多内容基本上都是从其他人为他们工作的脚本中剪切和粘贴的,但是我遇到了一个奇怪的问题,.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 的 Web 控制台中得到以下内容:
- 开始Session
- 获得元素
- 找到侧边栏
- 取得Parent
到此结束,我在 .remove
或 .removeChild
处死亡,所以要么我没有做正确的事情,要么我的安全设置有问题阻止我从没有人告诉我的网页中删除元素。
关于更多有趣的信息,尽管这个 post 的标题是 Greasemonkey,但 Tampermonkey 也失败了。
P.S。除了一些 Stylish CSS 之外,还使用了它,使我可以在小显示器上看到更大的漫画视图。 Stylish 是否 运行ning 并不重要。
该用户脚本有很多问题,但它们主要归结为:您需要注意控制台中的错误消息和 google 导致这些错误的函数。
例如:
- 那不是
getElementsByClassName
的工作方式。 querySelectorAll
没有 return 节点。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
.