Задать вопрос

Как создать скрипт удаления элемента HTML используя Tempermonkey?

Доброго времени суток

Обратите внимание на этот кусок кода
<div id="main_content" class="page_content">
   <table>
      <tbody>
         <tr data-panel="{&quot;focusable&quot;:true,&quot;clickOnActivate&quot;:true}" ...бля бля бля многа текста...>
            <td class="wht_date">8 июн. 2025 г.</td>
            <td data-tooltip-text="Подробная история Торговой площадки" class="wht_items " "="" aria-describedby="tooltip-3">
                  Торговая площадка Steam                  </td>
            <td class="wht_type ">...<div>
            <td class="wht_total ">...<div>
            <td class="wht_wallet_change wallet_column" ...бла бла бла очень много чего не важного для меня...>...</td>
            <td class="wht_wallet_balance wallet_column" ...бла бла бла все еще много не важного для меня...>...</td>
         </tr>
         <tr data-panel="{&quot;focusable&quot;:true,&quot;clickOnActivate&quot;:true}" ...бля бля бля многа текста...>
            <td class="wht_date">28 авг. 2024 г.</td>
            <td data-tooltip-text="Получить помощь по поводу этой покупки" class="wht_items " "="" aria-describedby="tooltip-69">
                  На кошелёк переведено 15 000₸                           </td>
            <td class="wht_type ">...</td>
            <td class="wht_total ">...</td>
            <td class="wht_wallet_change wallet_column" ...бла бла бла очень много чего не важного для меня...>...</td>
            <td class="wht_wallet_balance wallet_column" ...бла бла бла все еще много не важного для меня...>...</td>
         </tr>
         <tr>и так далее</tr>
         <tr>и тому подобное</tr>
         <tr>повторение</tr>


Мне нужен скрипт который бы скрывал, или полностью удалял теги селектора #main_content > table > tbody > tr, если в теге селектора #main_content > table > tbody > tr > td.wht_items встречается текст:
  • "Подробная история Торговой площадки"
  • "Торговая площадка Steam"
  • "На кошелёк переведено N сумму в валюте X"


Три варианта. Я смог реализовать первый вариант используя CSS и расширение браузера Stylus. Вот этот скрипт
@-moz-document url("https://store.steampowered.com/account/history/") {
    #main_content > table > tbody > tr:has(td.wht_items[data-tooltip-text="Подробная история Торговой площадки"]) *
    {
        font-size: 0px;
        height: 0px;
        padding-top: 0px;
        padding-bottom: 0px;
    }
}


И то этот скрипт не удаляет, а скрывает (уменьшает размеры) элементов внутри тега селектора #main_content > table > tbody > tr, если в теге селектора глубже есть искомый текст
#main_content > table > tbody > tr > td.wht_items[data-tooltip-text="Подробная история Торговой площадки"


Но работает это только если текст внутри атрибута, в данном случае внутри "data-tooltip-text"
<td data-tooltip-text="Подробная история Торговой площадки">
А что если текст это элемент тега? Например <td>Торговая площадка Steam</td>, или более того, если нужно добавить регулярное выражение или что-то в этом роде. Тут ведь Stylus и CSS уже не поможет, верно?

Я переключился на Tempermonkey, там скрипты уже пишутся на JS, в котором я полный ноль. Я лишь немного изучал CS. К слову и в CSS я полный ноль но это не мешало создавать скрипты для Stylus.

Так вот, на Tempermonkey есть такой скрипт
(function() {
    'use strict';
    const parent = document.querySelector("#main_content > table > tbody");
    if (parent) {
        let divCount = 0;
        function processNewElements() {
            const divs = parent.querySelectorAll(':scope > tr');
            const newDivCount = divs.length;
            if (newDivCount > divCount) {
                divCount = newDivCount;

                let num = 1;
                for (const div of divs) {
                    if (document
.querySelector("#main_content > table > tbody > tr:nth-child(" + num + ") > td.wht_items")
.innerText.includes("Торговая площадка Steam")) {
                        div.style.fontSize = '0px';
                        div.style.height = '0px';
                        div.style.paddingTop = '0px';
                        div.style.paddingBottom = '0px';
                    }
                    num++
                }
            }
        }
        const observer = new MutationObserver(function(mutations) {
            for (const mutation of mutations) {
                if (mutation.addedNodes.length) {
                    processNewElements();
                }
            }
        });
        observer.observe(parent, {
            childList: true,
            subtree: true
        });
        processNewElements();
    }
})();


Этот скрипт находит все вхождения #main_content > table > tbody > tr, а затем циклом через пень колоду проверяет каждое вхождение в котором содержится искомый текст. После чего применяет стиль.

НО. Текст ищется в селекторе #main_content > table > tbody > tr > td.wht_items, а стиль применяется только к селектору #main_content > table > tbody > tr. От чего элемент не пропадает полностью как в случае с Stylus. Там достаточно было добавить символ "*" в конце селектора, что бы заставить применятся стиль во всех вложенных тегах.
#main_content > table > tbody > tr:has(td.wht_items[data-tooltip-text="Подробная история Торговой площадки"]) *


А вот как сделать это в Tempermonkey я пока не знаю. Я пытался заменить все div.style. на один единственный div.remove();, что б не скрывать от глаз, а совсем удалить эти элементы. Но это работает не так как я ожидал, оно почему то удаляет даже то что не нужно, а то что нужно удаляет не все.

***

В общем мне нужна помощь с созданием скрипта Tempermonkey который будет искать текст элемента и атрибута внутри тегов #main_content > table > tbody > tr > td.wht_items, и при нахождении скрывать/удалять родительский тег, а именно #main_content > table > tbody > tr

Надеюсь я достаточно подробно все описал?
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@js-newbie
let regexp = />\s*(Торговая площадка Steam|Подробная история Торговой площадки|На кошелёк переведено.*?)\s*</;
function trRemove() {document.querySelectorAll('tbody tr').forEach(tr => {if (regexp.test(tr.innerHTML)) {tr.remove()}});}

let callback = function(mutations, observer) {trRemove();}
let config = {childList: true, subtree: true};
let observer = new MutationObserver(callback);
observer.observe(document.body, config);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы