在所有YouTube頁面上阻止縮圖懸停預覽(WebP和視頻)並停止頻道預告片(視頻+音頻)。保留進度條和播放按鈕。無需登錄或權限,頁面載入時執行。
目前為
// ==UserScript==
// @name YouTube - Block Autoplay Preview & Channel Trailer
// @name:ar يوتيوب - حظر معاينة التشغيل التلقائي وإعلان القناة
// @name:bg YouTube - Блокиране на Автоматично Възпроизвеждане на Преглед и Трейлър на Канал
// @name:ca YouTube - Bloqueja Previsualització de Reproducció Automàtica i Tràiler del Canal
// @name:cs YouTube - Blokovat Autoplay Náhled a Trailer Kanálu
// @name:cy YouTube - Bloc Rhagddangos Chwarae Awtomatig a Threilar Sianel
// @name:da YouTube - Blokér Autoplay-Forhåndsvisning og Kanaltrailer
// @name:de YouTube - Autoplay-Vorschau und Kanaltrailer Blockieren
// @name:el YouTube - Μπλοκάρει Προεπισκόπηση Αυτόματης Αναπαραγωγής και Τρέιλερ Καναλιού
// @name:eo YouTube - Bloki Aŭtomatan Antaŭrigardon kaj Kanalan Antaŭfilmon
// @name:es YouTube - Bloquear Vista Previa de Reproducción Automática y Tráiler del Canal
// @name:et YouTube - Blokeeri Autoplay Eelvaade ja Kanali Treiler
// @name:eu YouTube - Autoplay Aurrebista eta Kanaleko Trailerra Blokeatu
// @name:fi YouTube - Estä Autotoiston Esikatselu ja Kanavan Traileria
// @name:fr YouTube - Bloquer Aperçu Lecture Automatique et Bande-annonce de Chaîne
// @name:fr-CA YouTube - Bloquer Aperçu Lecture Automatique et Bande-annonce de Chaîne
// @name:gl YouTube - Bloquear Vista Previa de Reprodución Automática e Tráiler do Canal
// @name:he YouTube - חסום תצוגה מקדימה אוטומטית וטריילר ערוץ
// @name:hi YouTube - ऑटोप्ले पूर्वावलोकन और चैनल ट्रेलर ब्लॉक करें
// @name:hr YouTube - Blokiraj Automatski Pregled i Trailer Kanala
// @name:hu YouTube - Autoplay Előnézet és Csatorna Előzetes Blokkolása
// @name:id YouTube - Blokir Pratinjau Putar Otomatis dan Trailer Saluran
// @name:is YouTube - Blokera Sjálfvirka Forskoðun og Rásarstiklu
// @name:it YouTube - Blocca Anteprima Riproduzione Automatica e Trailer del Canale
// @name:ja YouTube - 自動再生プレビューとチャンネルトレーラーをブロック
// @name:ka YouTube - ავტომატური წინასწარი ჩვენებისა და არხის ტრეილერის ბლოკირება
// @name:ko YouTube - 자동 재생 미리보기 및 채널 예고편 차단
// @name:lt YouTube - Blokuoja Autoplay Peržiūrą ir Kanalo Anonsą
// @name:lv YouTube - Bloķēt Autoplay Priekšskatījumu un Kanāla Treileri
// @name:ms YouTube - Blok Pratinjau Putar Automatik dan Treler Saluran
// @name:nb YouTube - Blokker Forhåndsvisning av Autoplay og Kanaltrailer
// @name:nl YouTube - Blokkeer Automatische Afspeelvoorbeeld en Kanaaltrailer
// @name:no YouTube - Blokker Autoplay-Forhåndsvisning og Kanaltrailer
// @name:pl YouTube - Blokuj Podgląd Automatycznego Odtwarzania i Zwiastun Kanału
// @name:pt-BR YouTube - Bloquear Prévia de Reprodução Automática e Trailer do Canal
// @name:ro YouTube - Blochează Previzualizare Redare Automată și Trailer de Canal
// @name:ru YouTube - Блокировать Автовоспроизведение Превью и Трейлер Канала
// @name:sk YouTube - Blokovať Autoplay Náhľad a Ukážku Kanála
// @name:sl YouTube - Blokiraj Samodejni Predogled in Napovednik Kanala
// @name:sq YouTube - Bllokoni Parapamjen e Riprodhimit Automatike dhe Trailerin e Kanalit
// @name:sr YouTube - Blokiraj Automatsko Reprodukciju Pregleda i Trejler Kanala
// @name:sv YouTube - Blockera Autoplay-Förhandsgranskning och Kanaltrailer
// @name:th YouTube - บล็อกตัวอย่างการเล่นอัตโนมัติและตัวอย่างช่อง
// @name:tr YouTube - Otomatik Oynatma Önizlemesini ve Kanal Fragmanını Engelle
// @name:ug يوتيۇب - ئاپتوماتىك كۆرۈش ئالدىن كۆرۈش ۋە قانال تىزىرلىقىنى چەكلەش
// @name:uk YouTube - Блокувати Автовідтворення Попереднього Перегляду та Трейлер Каналу
// @name:vi YouTube - Chặn Xem Trước Tự Động Khi Hover & Trailer Kênh
// @name:zh-CN YouTube - 阻止自动播放预览和频道预告片
// @name:zh-TW YouTube - 阻止自動播放預覽和頻道預告片
// @description Blocks YouTube thumbnail hover previews (WebP & video) and stops channel trailers (video + audio). Keeps progress bars and play buttons. Works on all pages, no login or permissions needed, runs at document-start.
// @description:ar يحظر معاينات الصور المصغرة عند التمرير (WebP وفيديو) ويوقف إعلانات القناة (فيديو + صوت). يحافظ على أشرطة التقدم وأزرار التشغيل. يعمل على جميع الصفحات، بدون تسجيل دخول أو أذونات، يبدأ فور تحميل الصفحة.
// @description:bg Блокира предварителни прегледи при навеждане на миниатюри (WebP и видео) и спира трейлърите на канали (видео + звук). Запазва лентите за напредък и бутоните за възпроизвеждане. Работи на всички страници, без вход или разрешения, стартира при зареждане на страницата.
// @description:ca Bloqueja les visualitzacions prèvies de les miniatures en passar-hi per sobre (WebP i vídeo) i atura els tràilers del canal (vídeo + àudio). Manté les barres de progrés i els botons de reproducció. Sense inici de sessió ni permisos, s'executa al carregament de la pàgina.
// @description:cs Blokuje náhledy miniaturek při najetí myší (WebP a video) a zastavuje trailery kanálů (video + zvuk). Zachovává ukazatele postupu a tlačítka přehrávání. Bez přihlášení nebo oprávnění, spouští se při načtení stránky.
// @description:cy Bloc rhagddangos thumbnail hover (WebP a fideo) ac atal treilars sianel (fideo + sain). Cadw bariau cynnydd a botymau chwarae. Dim mewngofnodi na chaniatâd, yn rhedeg wrth lwytho'r dudalen.
// @description:da Blokerer miniature-hover-forhåndsvisninger (WebP og video) og stopper kanaltrailere (video + lyd). Bevarer fremskridtsmærker og afspilningsknapper. Ingen login eller tilladelser, kører ved sideindlæsning.
// @description:de Blockiert Hover-Vorschauen von Thumbnails (WebP & Video) und stoppt Kanaltrailer (Video + Ton). Behält Fortschrittsbalken und Play-Buttons bei. Kein Login oder Berechtigungen erforderlich, startet beim Seitenladen.
// @description:el Μπλοκάρει προεπισκοπήσεις εικόνων miniature κατά το hover (WebP και βίντεο) και σταματά τρέιλερ καναλιών (βίντεο + ήχος). Διατηρεί γραμμές προόδου και κουμπιά αναπαραγωγής. Χωρίς σύνδεση ή άδειες, εκτελείται κατά τη φόρτωση σελίδας.
// @description:eo Blokas miniaturojn hover antaŭrigardojn (WebP & video) kaj haltigas kanalajn antaŭfilmojn (video + sono). Konservas progresajn stangojn kaj ludbutonojn. Sen ensaluto aŭ permesoj, lanĉiĝas ĉe ŝarĝo de paĝo.
// @description:es Bloquea vistas previas de miniaturas al pasar el mouse (WebP y video) y detiene tráilers de canal (video + audio). Mantiene barras de progreso y botones de reproducción. Sin inicio de sesión ni permisos, se ejecuta al cargar la página.
// @description:et Blokeerib thumbnail-kursorilähisvaadet (WebP ja video) ja peatab kanalite treilerid (video + heli). Säilitab edenemisribad ja esitusnupud. Ilma sisselogimise või lubadeta, käivitub lehe laadimisel.
// @description:eu Aurrebista blokeatu thumbnail hover (WebP eta bideoa) eta gelditu kanalaren trailerrak (bideoa + audioa). Mantentzen ditu aurrerapen-barrak eta erreproduzitzeko botoiak. Saioa hasi gabe eta baimenik gabe, orria kargatzean exekutatzen da.
// @description:fi Estää thumbnail-kohdistus-esikatselut (WebP ja video) ja pysäyttää kanavan trailerit (video + ääni). Säilyttää edistymispalkit ja toistonapit. Ei kirjautumista tai lupia, käynnistyy sivun latautuessa.
// @description:fr Bloque les aperçus au survol des miniatures (WebP et vidéo) et arrête les bandes-annonces de chaîne (vidéo + son). Conserve les barres de progression et boutons de lecture. Sans connexion ni permission, s'exécute au chargement de la page.
// @description:fr-CA Bloque les aperçus au survol des miniatures (WebP et vidéo) et arrête les bandes-annonces de chaîne (vidéo + son). Conserve les barres de progression et boutons de lecture. Sans connexion ni permission, s'exécute au chargement de la page.
// @description:gl Bloquea as vistas previas de miniaturas ao pasar o rato (WebP e vídeo) e detén os tráilers do canal (vídeo + son). Mantén as barras de progreso e os botóns de reprodución. Sen inicio de sesión nin permisos, execútase ao cargar a páxina.
// @description:he חוסם תצוגות מקדימות של תמונות ממוזערות (WebP ווידאו) ועוצר טריילרים של ערוצים (וידאו + קול). שומר על סרגלי התקדמות וכפתורי ניגון. ללא כניסה או הרשאות, פועל בטעינת הדף.
// @description:hi YouTube थंबनेल होवर पूर्वावलोकन (WebP और वीडियो) और चैनल ट्रेलर (वीडियो + ऑडियो) ब्लॉक करता है। प्रोग्रेस बार और प्ले बटन रखता है। सभी पेजों पर काम करता है, लॉगिन या अनुमति नहीं चाहिए, पेज लोड होते ही चलता है।
// @description:hr Blokira preglede pri lebdenju na sličicama (WebP i video) i zaustavlja trailere kanala (video + zvuk). Zadržava trake napretka i tipke za reprodukciju. Bez prijave ili dozvola, pokreće se pri učitavanju stranice.
// @description:hu Blokkolja a miniatűr hover előnézeteket (WebP és video) és megállítja a csatorna előzeteseit (video + hang). Megtartja a folyamatjelzőket és lejátszási gombokat. Bejelentkezés vagy engedély nélkül, oldal betöltésekor fut.
// @description:id Memblokir pratinjau hover thumbnail (WebP & video) dan menghentikan trailer saluran (video + audio). Menjaga bilah kemajuan dan tombol putar. Tanpa login atau izin, berjalan saat halaman dimuat.
// @description:is Blokkar forsýnispillist fyrirsýni á öllum YouTube síðum (WebP og video) og stöðvar rásarstiklur (myndskeið + hljóð). Heldur áfram framfara stöng og spila hnöppum. Engin innskráning eða heimild, keyrir við hleðslu síðu.
// @description:it Blocca anteprime hover su miniature (WebP e video) e ferma i trailer dei canali (video + audio). Mantiene barre di avanzamento e pulsanti play. Nessun login o permessi, si avvia al caricamento della pagina.
// @description:ja YouTubeのすべてのページでサムネイルのホバー時プレビュー(WebPおよびビデオ)とチャンネルトレーラー(ビデオ+音声)をブロックします。進捗バーと再生ボタンを保持。ログインや権限不要、ページ読み込み時に実行。
// @description:ka ბლოკავს მინიატურების ჰოვერ წინასწარ ჩვენებას (WebP & ვიდეო) და აჩერებს არხის ტრეილერებს (ვიდეო + ხმა). ინახავს პროგრესის ზოლებსა და დაკვრის ღილაჩებს. შესვლა ან ნებართვა არაა საჭირო, გვერდის ჩატვირთვისას მუშაობს.
// @description:ko 모든 YouTube 페이지에서 썸네일 호버 미리보기(WebP 및 비디오)와 채널 예고편(비디오 + 오디오)을 차단합니다. 진행 막대와 재생 버튼을 유지합니다. 로그인이나 권한 불필요, 페이지 로드 시 실행.
// @description:lt Blokuoti miniatiūrų užvedimo peržiūras (WebP ir vaizdo įrašus) ir sustabdyti kanalų anonsus (vaizdo įrašas + garsas). Išlaiko pažangos juostas ir grojimo mygtukus. Be prisijungimo ar leidimų, veikia puslapio įkėlimo metu.
// @description:lv Bloķē sīktēlu pārslēgšanās priekšskatījumu (WebP un video) un aptur kanāla treilerus (video + audio). Saglabā progresa joslas un atskaņošanas pogas. Bez pieteikšanās vai atļaujām, darbojas lapas ielādes laikā.
// @description:ms Menghalang pratinjau hover thumbnail (WebP & video) dan menghentikan treler saluran (video + audio). Menyimpan bar kemajuan dan butang main. Tiada log masuk atau kebenaran, dijalankan semasa halaman dimuat.
// @description:nb Blokkerer forhåndsvisninger av miniatyrbilder ved svev (WebP og video) og stopper kanaltrailere (video + lyd). Beholder fremdriftslinjer og avspillingsknapper. Ingen innlogging eller tilladelser, kjører ved sidelasting.
// @description:nl Blokkeert hover-voorbeelden van thumbnails (WebP en video) en stopt kanaaltrailers (video + audio). Behoudt voortgangsbalken en afspeelknoppen. Geen login of toestemming, start bij paginalading.
// @description:no Blokkerer forhåndsvisninger av miniatyrer ved svev (WebP og video) og stopper kanaltrailere (video + lyd). Beholder fremdriftslinjer og avspillingsknapper. Ingen innlogging eller tilladelser, kjører ved sidelasting.
// @description:pl Blokuje podglądy miniaturek przy najechaniu myszą (WebP i wideo) oraz zatrzymuje zwiastuny kanałów (wideo + dźwięk). Zachowuje paski postępu i przyciski odtwarzania. Bez logowania i uprawnień, uruchamia się przy ładowaniu strony.
// @description:pt-BR Bloqueia prévias de miniaturas ao passar o mouse (WebP e vídeo) e interrompe trailers de canal (vídeo + áudio). Mantém barras de progresso e botões de play. Sem login ou permissão, executa ao carregar a página.
// @description:ro Blochează previzualizări la hover pe miniaturi (WebP și video) și oprește trailerele de canal (video + audio). Păstrează barele de progres și butoanele de redare. Fără login sau permisiuni, rulează la încărcarea paginii.
// @description:ru Блокирует превью при наведении на миниатюры (WebP и видео) и останавливает трейлеры каналов (видео + звук). Сохраняет индикаторы прогресса и кнопки воспроизведения. Без входа или разрешений, запускается при загрузке страницы.
// @description:sk Blokuje náhľady miniatúr pri prechode myšou (WebP a video) a zastavuje ukážky kanálov (video + zvuk). Zachováva ukazovatele postupu a tlačidlá prehrávania. Bez prihlásenia alebo povolení, spúšťa sa pri načítaní stránky.
// @description:sl Blokira predoglede sličic ob preletu (WebP in video) in ustavi napovednike kanalov (video + zvok). Ohrani vrstice napredka in gumbe za predvajanje. Brez prijave ali dovoljenj, zažene ob nalaganju strani.
// @description:sq Bllokon parapamjen e hover thumbnail (WebP dhe video) dhe ndalon trailerat e kanalit (video + audio). Mbaj shirita përparimi dhe butona luajtjeje. Pa hyrje ose leje, ekzekutohet gjatë ngarkimit të faqes.
// @description:sr Blokira preglede pri lebdećem pokazivaču na sličicama (WebP i video) i zaustavlja trejlere kanala (video + zvuk). Zadržava trake napretka i dugmiće za reprodukciju. Bez prijave ili dozvola, pokreće se pri učitavanju stranice.
// @description:sv Blockerar förhandsgranskningar vid hovring på miniatyrer (WebP och video) och stoppar kanaltrailers (video + ljud). Behåller förloppsindikatorer och uppspelningsknappar. Ingen inloggning eller behörighet, körs vid sidladdning.
// @description:th บล็อกตัวอย่างการเลื่อนเมาส์บนรูปย่อ (WebP และวิดีโอ) และหยุดตัวอย่างช่อง (วิดีโอ + เสียง) รักษาแถบความคืบหน้าและปุ่มเล่น ไม่ต้องล็อกอินหรืออนุญาต ทำงานเมื่อโหลดหน้าเว็บ
// @description:tr Tüm YouTube sayfalarında küçük resim hover önizlemelerini (WebP ve video) ve kanal fragmanlarını (video + ses) engeller. İlerleme çubuklarını ve oynat düğmelerini korur. Giriş veya izin gerekmez, sayfa yüklenirken çalışır.
// @description:ug بارلىق YouTube بەتلىرىدە كىچىك رەسىم hover ئالدىن كۆرۈشلىرىنى (WebP & ۋىدىيو) ۋە قانال تىزىرلىقلىرىنى (ۋىدىيو + ئاۋاز) چەكلەيدۇ. ئىلگىرىلەش تارىمىقى ۋە ئويناش كۇنۇپكىلىرىنى ساقلايدۇ. كىرىش ياكى ئىجازەت تەلەپ قىلمايدۇ، بەت يۈكلەنگەندە ئىجرا بولىدۇ.
// @description:uk Блокує попередній перегляд при наведенні на мініатюри (WebP та відео) та зупиняє трейлери каналів (відео + звук). Зберігає смуги прогресу та кнопки відтворення. Без входу чи дозволів, запускається при завантаженні сторінки.
// @description:vi Chặn hiệu ứng xem trước khi hover thumbnail (ảnh động WebP & video) và dừng trailer kênh (video + âm thanh). Giữ nguyên thanh tiến độ, nút play và ảnh tĩnh. Không cần đăng nhập, không cần quyền, chạy ngay khi tải trang.
// @description:zh-CN 在所有YouTube页面上阻止缩略图悬停预览(WebP和视频)并停止频道预告片(视频+音频)。保留进度条和播放按钮。无需登录或权限,页面加载时运行。
// @description:zh-TW 在所有YouTube頁面上阻止縮圖懸停預覽(WebP和視頻)並停止頻道預告片(視頻+音頻)。保留進度條和播放按鈕。無需登錄或權限,頁面載入時執行。
// @namespace https://greasyfork.org/users/979364-miebie-1412
// @author miebie.1412
// @version 1.2.8
// @match https://www.youtube.com/*
// @match http://www.youtube.com/*
// @match https://youtube.com/*
// @match http://youtube.com/*
// @grant none
// @run-at document-start
// @license MIT
// @homepageURL https://greasyfork.org/en/users/979364-miebie-1412
// @supportURL https://greasyfork.org/en/users/979364-miebie-1412
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABm0lEQVR4AdSWAZaCIBRFaTY2tbJsZTUra979iqECYqLWHJ4IfP67cMLhxx38NwF4Onfu1KiurfN4vQMAGd4V4HXVe23dOw+lbksP0A1MCNuwqk92mEVaUgOQOcbIOnd4AGF+BiBDa6jevXiA3Y1laIs+EkAMzn0FwEOoN+kS6uTcaSznnI8h3kvd6TK3AzeZXKRGeoSKpQzGiTcpDihV8ZIDwLCJTyvvBUrR7KKqackB/E3DXz36dqyGI1sOgPGoZM4Ruqp+SiUgycW8BTCiAqQEYjStbdYAIBMQ7AY7Q7tYtQAwTP7QGEypFoA/rosh1gJgaN+J1Arn+nMAvzOTl6w6mSsHkPTn4yK9/csPE+cA+ktDOGHpe/edSJ6OHABe3OHCi2kSSkY2FtTM4+rFvZJcUc0BMIkEXiQEijM/kAJtLKiZk1y54qyUAFjgVo+PAeA8b7XIbN4jd8AWbQA60zRQlrbiIJcd8zMAEguCq5N10t5QmONlFj0ArQ6CQX+hrFmTl/8b1NiZBgD0CAJCu1DqfXUd5CDvZIf/AQAA//8BTt4CAAAABklEQVQDALNfokFDr0z6AAAAAElFTkSuQmCC
// ==/UserScript==
(function () {
'use strict';
const style = document.createElement('style');
style.textContent = `
ytd-moving-thumbnail-renderer,
.ytd-moving-thumbnail-renderer,
ytd-thumbnail-overlay-resume-playback-renderer,
.ytd-thumbnail-overlay-resume-playback-renderer,
.ytp-cued-thumbnail-overlay,
.ytp-cued-thumbnail-overlay-image,
ytd-thumbnail-overlay-loading-preview-renderer,
.ytd-thumbnail-overlay-loading-preview-renderer,
ytd-video-preview,
.ytd-video-preview,
#thumbnail-overlay-play,
.thumbnail-overlay-play,
#video-preview-container,
.video-preview-container,
ytd-channel-video-player-renderer,
#c4-player,
ytd-player[context*="CHANNEL_TRAILER"] {
display: none !important;
visibility: hidden !important;
height: 0 !important;
width: 0 !important;
overflow: hidden !important;
pointer-events: none !important;
}
ytd-thumbnail img,
.ytd-thumbnail img {
transition: none !important;
opacity: 1 !important;
}
#overlays,
.ytd-rich-item-renderer #overlays,
ytd-thumbnail[has-inline-playback-button] #overlays,
ytd-thumbnail-overlay-toggle-pause-renderer,
.ytd-thumbnail-overlay-toggle-pause-renderer {
all: unset !important;
display: block !important;
}
`;
(document.head || document.documentElement).appendChild(style);
const blockAudio = () => {
['AudioContext', 'webkitAudioContext'].forEach(name => {
if (window[name] && !window[name].prototype._blocked) {
const AC = window[name];
AC.prototype._blocked = true;
const dummy = { connect: () => {}, disconnect: () => {} };
AC.prototype.createMediaElementSource = () => dummy;
AC.prototype.resume = () => Promise.resolve();
}
});
};
blockAudio();
setInterval(blockAudio, 200);
const isMainVideo = (video) => {
return location.pathname.startsWith('/watch') &&
(video.closest('ytd-watch-flexy') || video.closest('#ytd-player') || video.classList.contains('html5-main-video'));
};
const isTrailer = (el) => {
return el.closest('ytd-channel-video-player-renderer') ||
el.id === 'c4-player' ||
(el.tagName === 'YTD-PLAYER' && el.getAttribute('context') && el.getAttribute('context').includes('CHANNEL_TRAILER'));
};
const killVideo = (video) => {
if (!video || video._killed || isMainVideo(video)) return;
if (video.src && video.src.startsWith('blob:')) URL.revokeObjectURL(video.src);
video.pause();
video.muted = true;
video.volume = 0;
video.currentTime = 0;
video.src = '';
video.removeAttribute('src');
try { video.load(); } catch(e) {}
video._killed = true;
};
const blockAll = () => {
document.querySelectorAll('img[src*="an_webp"], video[src*="an_webp"], img[src*="video-preview"], video[src*="video-preview"]').forEach(el => {
if (el.tagName === 'IMG') {
el.src = el.src.replace(/an_webp\/[^&]*&/g, '').replace(/video-preview\/[^&]*&/g, '');
el.srcset = '';
} else if (el.tagName === 'VIDEO') {
el.src = el.src.replace(/an_webp\/[^&]*&/g, '').replace(/video-preview\/[^&]*&/g, '');
el.pause();
el.currentTime = 0;
el.removeAttribute('autoplay');
}
});
if (!location.pathname.startsWith('/watch')) {
document.querySelectorAll('video').forEach(v => {
if (isTrailer(v)) killVideo(v);
});
document.querySelectorAll('ytd-channel-video-player-renderer, #c4-player, ytd-player').forEach(el => {
if (isTrailer(el)) {
const vid = el.querySelector('video');
if (vid) killVideo(vid);
}
});
}
};
const observer = new MutationObserver(blockAll);
observer.observe(document.documentElement, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['src', 'srcset', 'class', 'id', 'context']
});
blockAll();
setInterval(blockAll, 500);
let lastUrl = location.href;
const navObs = new MutationObserver(() => {
if (location.href !== lastUrl) {
lastUrl = location.href;
setTimeout(blockAll, 100);
}
});
navObs.observe(document, { subtree: true, childList: true });
['pushState', 'replaceState'].forEach(m => {
const orig = history[m];
history[m] = function() {
orig.apply(this, arguments);
setTimeout(() => { if (location.href !== lastUrl) blockAll(); }, 80);
};
});
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', blockAll);
}
})();