通过Greasemonkey删除特定的网站内容

时间:2018-12-22 05:21:58

标签: javascript html webpage tampermonkey greasemonkey-4

我知道已经问过无数次类似的问题,我已经阅读了一段时间,但是我似乎无法使其适用于我的情况,我已经阅读了以下内容并试图将这些解决方案全部应用于Stack Overflow,但我没有获得成功,所以我很感谢您的帮助。

Article 1 Article 2 Article 3 Article 4 Article 5

我想从animenewsnetwork.com网站的侧边栏中删除“动漫本周”文章,我要删除的代码示例为:

<div class="herald box column" data-topics="article141022 column anime">
  <div class="category-line column"></div>
  <div class="thumbnail" data-src="/thumbnails/cover400x200/cms/this-week-in-anime/141022/g24.png.jpg">
    <div class="overlay">
      <div class="category column">column</div>
      <div class="comments"> <a href="/cms/discuss/141022">51 comments</a> </div>
    </div>
    <a href="/this-week-in-anime/2018-12-20/.141022" data-track="id=66149&amp;from=HP.MF"></a>
  </div>
  <div class="wrap">
    <div>
      <h3>
        <a href="/this-week-in-anime/2018-12-20/.141022" data-track="id=66149&amp;from=HP.MF">This Week in Anime - Is Back Street Girls: Gokudols Worth Watching?</a>
      </h3>
      <div class="byline">
        <time datetime="2018-12-20T19:31:04Z" title="2018-Dec-20 11:31:04 -0800 (1.4 day ago)">Dec 20, 14:31</time>
        <div class="comments"> <a href="/cms/discuss/141022">51 comments</a> </div>
        <span class="topics"> <span class="anime">anime</span> </span>
      </div>
      <div class="preview">
        <span class="intro">Netflix's newest anime acquisition is controversial to say the least. Andy and Steve find out (the hard way) if there's any decent comedy hiding under this show's initial shock factor.
        </span>
        <span class="full">Netflix's newest acquisition, Back Street Girls: Gokudols, is controversial to say the least. This week, Andy and Steve find out if there's any decent comedy hiding under this show's initial shock factor. Disclaimer...
        </span>
      </div>
    </div>
  </div>
</div>

我想尝试将其完全删除,我认为是在搜索字符串“ this-week-in-anime”,然后删除或隐藏它的父级,但是我没有使其正常工作。

我尝试过类似的事情:

var badDivs = $("div div:contains('this-week-in-anime')");
badDivs.hide ();

var badDivs = $("div div:contains(this-week-in-anime)");
badDivs.parent ().hide ();

$('li:contains("this-week-in-anime")').parent().hide();

编辑:脚本的最终形式和在其他地方收到的建议。

 ==UserScript==
// @name     _Anime News Network, remove "This Week in Anime" articles
// @match    *://www.animenewsnetwork.com/*
// @grant    none
// @run-at   document-idle
// ==/UserScript==

(function () {
    'use strict';
    if (!Element.prototype.matches) {
        Element.prototype.matches =
            Element.prototype.matchesSelector ||
            Element.prototype.mozMatchesSelector ||
            Element.prototype.msMatchesSelector ||
            Element.prototype.oMatchesSelector ||
            Element.prototype.webkitMatchesSelector;
    }

    var getParent = function (node, selector) {
        while (node && node.parentNode) {
            node = node.parentNode;
            if (node.matches(selector)) {
                return node;
            }
        }
    };

    document.querySelectorAll(".thumbnail > a[href*='this-week-in-anime']").forEach(function (v) {
        var node = getParent(v, '.herald.box');
        if (node) {
            node.remove();
        }
    });
})();
  

要考虑的一些事情:

     

将您的内容封装在一个函数中。这样可以防止您声明可以从页面本身访问的内容。

     

"use strict";,因为函数的第一行修复了您可能不会立即捕获的某些JS烦恼。例如,   变量名。

     

尝试避免使用@require。如果该资源无法传递,这可能会长时间阻止页面加载

     

如果要删除元素,@run-at document-idle是一个好的开始,因为它可以确保触发了“加载”事件

     

如果以后要动态加载要删除的元素,请使用setInterval或更佳的MutationObserver

     

尝试避免使用jQuery。到目前为止,大多数功能都可以在常规JS中使用。

     

在我的示例中,我完全删除了该节点。如果你不想那样   您可以使用node.style.display='none'

1 个答案:

答案 0 :(得分:0)

实际上,that first article you linked具有您需要的技术。由于您的目标网页使用javascript添加了令人反感的内容,因此您需要使用类似waitForKeyElements()的内容。

请注意,:contains搜索文本,但是令人讨厌的“动漫本周”位于各种节点属性中。因此,我们在其href中寻找与其相关的链接。

这是your target website的配置:

// ==UserScript==
// @name     _Anime News Network, remove "This Week in Anime" articles
// @match    *://www.animenewsnetwork.com/*
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    none
// ==/UserScript==
//-- WARNING: Using the page's copy of jQuery.  This may blow up at some point.
/* global $, waitForKeyElements */

waitForKeyElements (".thumbnail > a[href*='this-week-in-anime']", hideContainerNode);

function hideContainerNode (jNode) {
    //-- jQuery closest() finds an ancestor of current node.
    var containerNode = jNode.closest (".herald.box");
    containerNode.hide ();
}