Greasemonkey脚本无法删除元素

时间:2018-05-23 22:00:27

标签: javascript tampermonkey greasemonkey-4

很多这个脚本基本上是从其他人的脚本中剪切和粘贴的,但我对.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控制台中获得以下内容:

  • 开始会话
  • 有元素
  • 找到SideBar
  • Made Parent

那是一个包装,我在.remove.removeChild都死了,所以要么我没有正确地做某事,要么我遇到安全设置问题阻止我从没有人告诉我的网页中删除元素。

有关更多有趣的信息,虽然这篇文章的标题是Greasemonkey,但这也失败了Tampermonkey。

P.S。除了一些时尚的CSS之外,它还被用于允许我在小型显示器上拥有更大的漫画视图。如果时尚正在运行并不重要。

1 个答案:

答案 0 :(得分:0)

该用户脚本存在许多问题,但它们大部分归结为:您需要在控制台中记下错误消息并谷歌查看导致它们的功能。
例如:

  • 那不是getElementsByClassName的工作方式。
  • querySelectorAll不会返回节点。
  • parentNoderemoveChild都在单个节点上执行。

另外:似乎不需要第二个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更快,更强大。