Как использовать greasemonkey для выборочного удаления контента с сайта - PullRequest
7 голосов
/ 07 февраля 2012

Содержимое, которое я пытаюсь изменить, содержит серию <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 Ответ

12 голосов
/ 07 февраля 2012

Для вопросов, подобных этому, разместите ссылку на целевую страницу.Или, если это действительно невозможно, сохраните страницу на pastebin.com и ссылку на нее.

В любом случае, general ответ на ваш вопрос не слишкомс помощью jQuery содержит () селектор .Примерно так будет работать:

// ==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 класс isHot или 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) страниц

используйте MutationObserver или waitForKeyElements.(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 ();
    }
}
...