您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
让 hololyzer 的超级留言清单支持按姓名排序
当前为
- // ==UserScript==
- // @name hololyzer Sort Tool
- // @name:zh hololyzer 排序工具
- // @name:zh-TW hololyzer 排序工具
- // @name:zh-CN hololyzer 排序工具
- // @namespace https://github.com/kevin823lin
- // @version 0.1
- // @description Add support for sort hololyzer's super chat list by name.
- // @description:zh 讓 hololyzer 的超級留言清單支援按姓名排序
- // @description:zh-TW 讓 hololyzer 的超級留言清單支援按姓名排序
- // @description:zh-CN 让 hololyzer 的超级留言清单支持按姓名排序
- // @author kevin823lin
- // @match https://www.hololyzer.net/*/superchat/*
- // @icon https://www.google.com/s2/favicons?domain=hololyzer.net
- // @grant none
- // @date 2021-12-11
- // ==/UserScript==
- (function () {
- 'use strict';
- // Your code here...
- window.addEventListener('load', function (event) {
- document.body.dataset.sortBy = "time";
- insertButton();
- }, false);
- function insertButton() {
- const sortByTime = document.createElement('button');
- const sortByName = document.createElement('button');
- sortByTime.innerHTML = "時間排序";
- sortByName.innerHTML = "姓名排序";
- sortByTime.addEventListener("click", function () {
- if (document.body.dataset.sortBy !== "time") {
- window.location.href = window.location.href;
- }
- });
- sortByName.addEventListener("click", async function () {
- if ((document.body.dataset.sortBy) !== "name") {
- document.body.dataset.sortBy = "name";
- await waitElementsLoaded('table[border]');
- main();
- }
- });
- document.body.insertAdjacentElement('afterbegin', sortByName);
- document.body.insertAdjacentElement('afterbegin', sortByTime);
- }
- function main() {
- move();
- sort();
- insert();
- }
- function move() {
- const tbody = document.querySelector('table[border] > tbody');
- const trs = tbody.querySelectorAll("tr");
- const insertIndex = [...tbody.querySelectorAll("th")].findIndex(th => th.matches('[style]'));
- tbody.querySelectorAll('[rowspan]').forEach(a => a.removeAttribute('rowspan'))
- trs.forEach((tr, i) => {
- if (i % 2) {
- const parentEle = trs[i - 1];
- const childrenEle = parentEle.children[insertIndex + 1];
- const insertEle = tr.querySelector("th") || tr.querySelector("td");
- childrenEle.removeAttribute('style');
- insertEle.removeAttribute('style');
- insertEle.parentElement.remove();
- parentEle.insertBefore(insertEle, childrenEle);
- }
- })
- }
- function sort() {
- const tbody = document.querySelector('table[border] > tbody');
- const trs = [...tbody.querySelectorAll("tr")].filter(tr => {
- return tr.querySelector('td');
- });
- let sortIndex = [...tbody.querySelectorAll('th')].findIndex(th => th.innerText === "チャンネル名");
- if (sortIndex === -1) {
- sortIndex = 6;
- }
- trs.sort(function (a, b) {
- var keyA = a.querySelector(`td:nth-child(${sortIndex + 1})`).textContent;
- var keyB = b.querySelector(`td:nth-child(${sortIndex + 1})`).textContent;
- return keyA.localeCompare(keyB, 'ja');
- });
- for (const tr of trs) {
- tbody.append(tr);
- }
- }
- function insert() {
- const tbody = document.querySelector('table[border] > tbody');
- const trs = [...tbody.querySelectorAll("tr")].filter(tr => {
- return tr.querySelector('td');
- });
- let insertIndex = [...tbody.querySelectorAll('th')].findIndex(th => th.innerText === "No");
- if (insertIndex === -1) {
- insertIndex = 0;
- }
- let sortIndex = [...tbody.querySelectorAll('th')].findIndex(th => th.innerText === "チャンネル名");
- if (sortIndex === -1) {
- sortIndex = 6;
- }
- let count = 0;
- const countList = new Array();
- for (const [i, tr] of trs.entries()) {
- const preName = trs[i - 1] && trs[i - 1].querySelector(`:nth-child(${sortIndex + 1})`)?.innerText;
- const name = tr.querySelector(`:nth-child(${sortIndex + 1})`)?.innerText;
- countList.push(preName !== name ? ++count : count);
- }
- for (const [i, tr] of trs.entries()) {
- const insertEle = tr.insertCell(insertIndex + 1);
- insertEle.innerHTML = countList[i];
- insertEle.style = "text-align: right";
- }
- const parentEle = tbody.querySelector("tr");
- const childrenEle = parentEle.children[insertIndex + 1];
- const insertEle = document.createElement("th");
- insertEle.innerHTML = "去除重複";
- insertEle.style = "white-space: nowrap;";
- parentEle.insertBefore(insertEle, childrenEle);
- }
- function waitElementsLoaded(...eles) {
- return Promise.all(eles.map(ele => {
- return new Promise(async resolve => {
- while (!document.querySelector(ele)) {
- await wait(100);
- }
- resolve();
- });
- }));
- }
- function wait(ms) {
- try {
- return new Promise(r => setTimeout(r, ms));
- } catch (e) {
- console.error(`wait: ${e}`);
- }
- }
- })();