您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
小説家になろう(厳密には小説を読もう)ランキングでのNGフィルタリング機能を提供
当前为
// ==UserScript== // @name Narou ranking ng // @namespace http://tampermonkey.net/ // @version 1.0 // @description 小説家になろう(厳密には小説を読もう)ランキングでのNGフィルタリング機能を提供 // @author amaicoffee // @match https://yomou.syosetu.com/rank/genrelist/type/* // @match https://yomou.syosetu.com/rank/list/type/* // @grant GM_getValue // @grant GM_setValue // ==/UserScript== /* ユーザースクリプトの説明 注意!このスクリプトはJavaScript練習を兼ねたものです!ライセンスはMITライセンスです。(多分) 小説を読もう!の「ジャンル別ランキング」「総合ランキング」ページで動作するスクリプトで、 ランキング内、小説タイトル横に追加する「表示/非表示」ボタンを押すと、その小説はNGに登録され説明文が折りたたまれます。 NG登録はGM setValueで保存され、ページ遷移に耐えます。 登録したNGを消す方法は画面右下のフローティングボタン「delete ng data」を押して下さい。 */ /* 残った問題点 命名規則の統一 関数(メソッド?)に分離できるところはする グローバル変数をなくす(全体を即時実行関数の中にしまってグローバル汚染をなくす) */ // スクリプトでNG小説を隠すのに使うCSS要素を作成して追加 var CENSORED_STYLE = document.createElement('style'); CENSORED_STYLE.innerHTML = ".censored { display: none; }"; document.head.appendChild(CENSORED_STYLE); // ランキング内の小説をノードリストとして所得 var ranking_list_list = document.querySelectorAll('.ranking_list'); // セーブデータ保存・読込用キー const NAROU_NG_IDS_KEY = 'narou_ng_ids'; function load_ng_ids() { const DATA = GM_getValue(NAROU_NG_IDS_KEY); if (DATA) { // Truthyのとき return DATA.split(' '); // セーブデータは空白区切り。加工して返す } else { return []; } } function save_ng_ids(array) { GM_setValue(NAROU_NG_IDS_KEY, array.join(' ')); } // ランキング内小説ID配列とNG小説ID配列 // e => a.firstElementChild.getAttribute('href').substr(-8, 7) var ranked_id_arr = Array.from(document.querySelectorAll('.tl'), a => a.href.substring(26, 33)); var ng_id_arr = load_ng_ids(); // NG登録ボタンを↑のリスト個数分つくって配列に追加 var button_array = []; for (let i = 0; i < ranking_list_list.length; i++) { button_array[i] = document.createElement('button'); button_array[i].innerText = '表示 / 非表示'; button_array[i].classList.add('ngbtn');// 苦肉の策 ranking_list_list[i].firstElementChild.appendChild(button_array[i]); } function toggle(num) { var target_classList = ranking_list_list[num].lastElementChild.classList; var target_id = ranked_id_arr[num]; if (target_classList.contains('censored')) { target_classList.remove('censored'); ng_id_arr = ng_id_arr.filter(id => id != target_id) } else { target_classList.add('censored'); ng_id_arr.push(target_id); } console.log('ng id array changed -->') console.log(ng_id_arr) save_ng_ids(ng_id_arr) } // なんでこれで良いのか。よくわからないけど動いてるからヨシ! var ngbtns = document.querySelectorAll('.ngbtn'); for (let j = 0; j < ngbtns.length; j++) { ngbtns[j].addEventListener('click', function () { toggle(j); }); } if (ng_id_arr.length > 0) { console.log('save data found'); console.log(ng_id_arr) let key_array = ng_id_arr.slice(); for (let i = 0; i < ranked_id_arr.length; i++) { for (let j = 0; j < key_array.length; j++) { let soeji = ranked_id_arr.indexOf(key_array[j]) if (soeji != -1) { ranking_list_list[soeji].lastElementChild.classList.add('censored') key_array.splice(j, 1) console.log(ng_id_arr) } } } } else { console.log('save data not found'); } const DELETE_BUTTON_STYLE = document.createElement('style'); DELETE_BUTTON_STYLE.innerHTML = ".floated { position: fixed; right: 0; bottom: 0; }" document.head.appendChild(DELETE_BUTTON_STYLE); const DELETE_SAVE_DATA_BUTTON = document.createElement('button'); DELETE_SAVE_DATA_BUTTON.innerText = 'delete ng data'; DELETE_SAVE_DATA_BUTTON.classList.add('floated'); DELETE_SAVE_DATA_BUTTON.addEventListener('click', delete_save_data); document.body.appendChild(DELETE_SAVE_DATA_BUTTON); function delete_save_data() { const blank_data = ''; GM_setValue(NAROU_NG_IDS_KEY, blank_data) window.alert('ng data has deleted') }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址