Блокування банерів Google

У мене є пропозиція щодо використання Google-перекладача (звісно, якщо ви його використовуєте у CMS).

Після перекладу сторінки, коли ви наводите курсор миші на абзац, то він підсвічується, і з'являється спливаючий банер з пропозицією оцінити сервіс. Так от, наступна пропозиція полягає в тому, щоб його прибрати, як тільки Google-перекладач завершить свою роботу.

Знайшов лише два шляхи:

  • Дочекатися завантаження ДОМ і спробувати його хакнути JS-скриптом.
  • Додати стилі, які просто блокують цю всю історію.

Скажу відразу, що тільки зі скриптом і DOMом у мене нічого не вийшло, хоча покликаний на допомогу Copilot обіцяв, що це легко. А от стилі в голові сторінки - працюють на ура, хоча й теж не самостійно.

Приклад CSS на розгляд:

<style>
#goog-gt-tt,
.goog-tooltip.skiptranslate,
.activity-root,
.status-message,
.started-activity-container {
    display: none !important;
    visibility: hidden !important;
    top: 0px !important;
}

.goog-te-banner-frame.skiptranslate {
    display: none !important;
}
body {
    top: 0px !important;
	margin-top: 0 !important;
}
font {
    background-color: transparent !important;
    box-shadow: none !important;
}

.goog-text-highlight {
    background-color: transparent !important;
    border: none !important;
    box-shadow: none !important;
}
</style>

Все добре, але залишається зверху пустота після фрейму з банером Google, хоча самого банера уже й не видно. Тому, тут уже діємо скриптом:

<script>
function removeBanner() {
    const banner = document.querySelector('iframe[src*="translate.goog"]');
    if (banner) {
        banner.remove();	// Видалити iframe, якщо є
    }
}

// Cлідкуємо за змінами в DOM і видаляємо iframe щоразу, як він з'являється
const observer = new MutationObserver(mutations => {
    mutations.forEach(mutation => {
        if (mutation.addedNodes.length) {
            removeBanner();
        }
    });
});

observer.observe(document.body, { childList: true, subtree: true });

window.addEventListener('load', removeBanner); // Видалити банер при завантаженні сторінки
</script>

З плюсів - перезапуску DOM немає, але він відслідковується. Замість простого видалення iframe після завантаження сторінки, використовується MutationObserver. Він слідкує за змінами в DOM і видаляє iframe щоразу, коли той з'являється. Може, є ще способи, але я кращого не придумав.

Для порівняння можна переглянути оригінальна сторінка, і з урахуванням змін - виправлена версія.

Ну й на цьому все сьогодні.