如何使用greasemonkey从网站上有选择地删除内容

IT技术 javascript html greasemonkey webpage tampermonkey
2021-02-05 17:19:37

我试图修改的内容有一系列<div>条目,每个<div>条目中都有其他条目。这里没有任何id标签可以提供帮助。我希望脚本做的是检查每个<div>条目的内容并查找一些文本。这将用于确定是否删除/隐藏整个 '' 条目。这可能吗?如何?

下面是一个例子。页面中有几个,我想删除/隐藏<div class="foo bar">标签内文本显示“是”的那些所以在这个例子中,整个事情都会被删除/隐藏。

<div class="entry">

<div class="fooPhoto"><a href="Addfoo.jsp?tid=954102"><img class="person" src="http://static.barfoo.com/images/site/icons/dude.png" border="0" width="24" height="24" onerror="this.src='images/site/icons/dude.png'" title="Photo Unavailable" alt="Photo Unavailable" ></a></div>

<div class="fooAvg">4.7</div>     

<div class="foo bar">Yes</div>

<div class="fooShare">
<a class="shareEmail" href="referral.jsp?sid=882&tid=954102&pgid=3">Share using email</a>
</div>

</div><!-- closes entry -->
1个回答

对于此类问题,请发布指向目标页面的链接。或者,如果这真的不可能,请将页面保存到pastebin.com并链接到该页面

无论如何,对于您的问题一般答案对于jQuery contains() 选择器并不太难像这样的事情会起作用:

// ==UserScript==
// @name     _Remove annoying divs
// @include  http://YOUR_SERVER/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==
//- The @grant directive is needed to restore the proper sandbox.

/*--- Use the jQuery contains selector to find content to remove.
    Beware that not all whitespace is as it appears.
*/
var badDivs = $("div div:contains('Annoying text, CASE SENSITIVE')");

badDivs.remove ();

//-- Or use badDivs.hide(); to just hide the content.


更新新澄清的问题/代码:

在您的具体示例中,您将使用以下命令:

var badDivs = $("div.entry div.foo:contains('Yes')");

badDivs.parent ().remove ();


评论中指定站点的更新:
请注意,无需搜索文本,因为该站点方便地为键 div 提供了类isHotor notHot

// ==UserScript==
// @name     _Unless they're hot, they're not (shown).
// @include  http://www.ratemyprofessors.com/SelectTeacher.jsp*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==
//- The @grant directive is needed to restore the proper sandbox.

var badDivs = $("#ratingTable div.entry").has ("div.notHot");

badDivs.remove ();


最后,对于动态(AJAX 驱动)页面,

使用MutationObserverwaitForKeyElements(WaitForKeyElements 在静态页面上也能正常工作。)

这是上面重写的脚本以支持 AJAX:

// ==UserScript==
// @name     _Unless they're hot, they're not (shown).
// @include  http://www.ratemyprofessors.com/SelectTeacher.jsp*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==
//- The @grant directive is needed to restore the proper sandbox.

waitForKeyElements ("#ratingTable div.entry", deleteNotHot);

function deleteNotHot (jNode) {
    if (jNode.has("div.notHot").length) {
        jNode.remove ();
    }
}
感谢您为您的问题添加一些细节。请参阅更新的答案。
2021-03-22 17:19:37
实际上,foobar 中有一个空格,因此它是“foo bar”。那么代码是什么?
2021-03-23 17:19:37
所以你是说如果 div 在类名中有空格,你只使用其中的第一个词?我试过了,它不起作用。其实入口div也是两个词。
2021-04-01 17:19:37
即使它确实做了一些事情,看起来你的例子也行不通。删除包含文本的 div 是不够的。该 div 所在的 div 也必须删除。
2021-04-03 17:19:37
一行将更改为:(var badDivs = $("div.entry div.foo:contains('Yes')");全部在一行上)
2021-04-13 17:19:37