您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a filter to hide non-participants from favs only standings table on AtCoder.
当前为
// ==UserScript== // @name AtCoder Non-Participant Hider // @namespace https://github.com/Gai-H/atcoder-non-participant-hider // @version 1.0 // @description Add a filter to hide non-participants from favs only standings table on AtCoder. // @description:ja お気に入りの順位表に不参加者を隠すフィルターを追加します。 // @author Gai // @homepage https://github.com/Gai-H // @source https://github.com/Gai-H/atcoder-non-participant-hider // @match https://atcoder.jp/*standings* // @exclude https://atcoder.jp/*standings/json // @license MIT // ==/UserScript== const CHECKBOX_ID = "checkbox-fav-only-participant-atcodernonparticipanthider"; const CHECKBOX_TEXT_JA = "お気に入りの不参加者を非表示"; const CHECKBOX_TEXT_EN = "Hide non-participants from favs"; const CHECKBOX_HTML = ` <div class="checkbox"> <label> <input id="${CHECKBOX_ID}" type="checkbox"> ${document.cookie.includes("language=ja") ? CHECKBOX_TEXT_JA : CHECKBOX_TEXT_EN} </label> </div> `; let theCheckbox = null; let favOnlyCheckbox = null; let standingsTbody = null; // チェックボックス追加 const bodyObserver = new MutationObserver((_, observer) => { favOnlyCheckbox = document.getElementById("checkbox-fav-only"); if (!favOnlyCheckbox) return; observer.disconnect(); favOnlyCheckbox.addEventListener("change", onFavOnlyCheckboxChange); const favOnlyCheckboxDiv = favOnlyCheckbox.parentElement.parentElement; favOnlyCheckboxDiv.insertAdjacentHTML("afterend", CHECKBOX_HTML); theCheckbox = document.getElementById(CHECKBOX_ID); theCheckbox.disabled = !favOnlyCheckbox.checked; theCheckbox.checked = localStorage.getItem(CHECKBOX_ID) ?? true; theCheckbox.addEventListener("change", onTheCheckboxChange); standingsTbody = document.getElementById("standings-tbody"); standingsTbodyObserver.observe(standingsTbody, { childList: true, attributeFilter: ["class"], }); hideNonParticipants(); }); bodyObserver.observe(document.body, { childList: true, subtree: true, }); // 順位表テーブルのハンドラ const standingsTbodyObserver = new MutationObserver(() => hideNonParticipants()); // "お気に入りのみ表示"チェックボックスのハンドラ const onFavOnlyCheckboxChange = () => { theCheckbox.disabled = !favOnlyCheckbox.checked; hideNonParticipants(); }; // "お気に入りの不参加者を非表示"チェックボックスのハンドラ const onTheCheckboxChange = () => { localStorage.setItem(CHECKBOX_ID, theCheckbox.checked); hideNonParticipants(); }; const hideNonParticipants = () => { if (!favOnlyCheckbox.checked) return; const standingsTrs = standingsTbody.children; for (const row of standingsTrs) { const rankTd = row.children[0]; if (rankTd.innerText !== "-") continue; if (theCheckbox.checked) { row.classList.add("hidden"); } else { row.classList.remove("hidden"); } } };