表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。

PCのブラウザで小説家になろう小説を読む人向けのキーボードでページめくりできるスクリプト

作者: PXXN3
掲載日:2024/01/03

なろうで小説を読むとき、前話や次話を見るには画面の先頭や末尾までスクロールして前へや次へをクリックする必要があります。


これをいつでもワンキーでできるようにする魔法をこれから紹介します。


① Google Chrome や Firefox などのブラウザをお使いの方は、まず最初にスクリプト実行できる拡張機能を選んで有効にしてください。

JavaScript を inject 実行できる拡張機能ならなんでもよいです。

Chrome では Script Injector や Script Runner Pro など、Firefox なら run-a-script や Injector などといったものが無数にあります。

使いやすく信頼できるものを選んでください。


② 次に以下のスクリプトをコピペして必要なサイトで自動で読み込むように設定してください。


ページめくりスクリプト

///////////////////////////////////////////////////ここから

(() => {

"use strict";

const list = [

{ url: 'kakuyomu.jp/works/',

code: 'ArrowLeft',

modifiers: '',

type: 'query',

link: 'link[rel="prev"]',

},

{ url: 'kakuyomu.jp/works/',

code: 'NumpadSubtract',

modifiers: '',

type: 'query',

link: 'link[rel="prev"]',

},

{ url: 'kakuyomu.jp/works/',

code: 'ArrowRight',

modifiers: '',

type: 'query',

link: 'link[rel="next"]',

},

{ url: 'kakuyomu.jp/works/',

code: 'NumpadAdd',

modifiers: '',

type: 'query',

link: 'link[rel="next"]',

},

{ url: 'kakuyomu.jp/works/',

code: 'Enter',

modifiers: '',

type: 'a',

link: '続きから読む',

},

{ url: 'kakuyomu.jp/works/',

code: 'NumpadEnter',

modifiers: '',

type: 'a',

link: '続きから読む',

},

{ url: 'https://kakuyomu.jp/my/antenna/works',

code: 'ArrowLeft',

modifiers: '',

type: 'a',

link: '前へ',

},

{ url: 'https://kakuyomu.jp/my/antenna/works',

code: 'NumpadSubtract',

modifiers: '',

type: 'a',

link: '前へ',

},

{ url: 'https://kakuyomu.jp/my/antenna/works',

code: 'ArrowRight',

modifiers: '',

type: 'a',

link: '次へ',

},

{ url: 'https://kakuyomu.jp/my/antenna/works',

code: 'NumpadAdd',

modifiers: '',

type: 'a',

link: '次へ',

},

{ url: 'kakuyomu.jp/',

code: 'BracketLeft',

modifiers: '',

type: 'url',

link: 'https://kakuyomu.jp/my',

},

{ url: 'kakuyomu.jp/',

code: 'Numpad3',

modifiers: '',

type: 'url',

link: 'https://kakuyomu.jp/my',

},

{ url: 'kakuyomu.jp/',

code: 'BracketRight',

modifiers: '',

type: 'url',

link: 'https://kakuyomu.jp/my/antenna/works',

},

{ url: 'kakuyomu.jp/',

code: 'Numpad2',

modifiers: '',

type: 'url',

link: 'https://kakuyomu.jp/my/antenna/works',

},

{ url: 'syosetu.com/',

code: 'ArrowLeft',

modifiers: '',

type: 'query',

link: 'a.c-pager__item--before',

},

{ url: 'syosetu.com/',

code: 'NumpadSubtract',

modifiers: '',

type: 'query',

link: 'a.c-pager__item--before',

},

{ url: 'syosetu.com/',

code: 'ArrowRight',

modifiers: '',

type: 'query',

link: 'a.c-pager__item--next',

},

{ url: 'syosetu.com/',

code: 'NumpadAdd',

modifiers: '',

type: 'query',

link: 'a.c-pager__item--next',

},

{ url: 'syosetu.com/favnovelmain',

code: 'ArrowLeft',

modifiers: '',

type: 'query',

link: 'a.c-up-pager__item[title*="前"]',

},

{ url: 'syosetu.com/favnovelmain',

code: 'NumpadSubtract',

modifiers: '',

type: 'query',

link: 'a.c-up-pager__item[title*="前"]',

},

{ url: 'syosetu.com/favnovelmain',

code: 'ArrowRight',

modifiers: '',

type: 'query',

link: 'a.c-up-pager__item[title*="次"]',

},

{ url: 'syosetu.com/favnovelmain',

code: 'NumpadAdd',

modifiers: '',

type: 'query',

link: 'a.c-up-pager__item[title*="次"]',

},

{ url: 'syosetu.com/impression/',

code: 'ArrowLeft',

modifiers: '',

type: 'query',

link: 'a[title="前のページ"]',

},

{ url: 'syosetu.com/impression/',

code: 'NumpadSubtract',

modifiers: '',

type: 'query',

link: 'a[title="前のページ"]',

},

{ url: 'syosetu.com/impression/',

code: 'ArrowRight',

modifiers: '',

type: 'query',

link: 'a[title="次のページ"]',

},

{ url: 'syosetu.com/impression/',

code: 'NumpadAdd',

modifiers: '',

type: 'query',

link: 'a[title="次のページ"]',

},

{ url: 'syosetu.com/impression/',

code: 'ArrowLeft',

modifiers: '+',

type: 'dec',

re: '\/no\/(\\d+)\/.*',

str: '/no/$$/',

},

{ url: 'syosetu.com/impression/',

code: 'NumpadSubtract',

modifiers: '+',

type: 'dec',

re: '\/no\/(\\d+)\/.*',

str: '/no/$$/',

},

{ url: 'syosetu.com/impression/',

code: 'ArrowRight',

modifiers: '+',

type: 'inc',

re: '\/no\/(\\d+)\/.*',

str: '/no/$$/',

},

{ url: 'syosetu.com/impression/',

code: 'NumpadAdd',

modifiers: '+',

type: 'inc',

re: '\/no\/(\\d+)\/.*',

str: '/no/$$/',

},

{ url: 'syosetu.com/',

code: 'Enter',

modifiers: '',

type: 'query',

link: 'div.p-novel__bookmarker-no > a',

},

{ url: 'syosetu.com/',

code: 'NumpadEnter',

modifiers: '',

type: 'query',

link: 'div.p-novel__bookmarker-no > a',

},

{ url: 'syosetu.com/',

code: 'Enter',

modifiers: '',

type: 'queryclick',

link: 'input[name*="siori_url"]',

},

{ url: 'syosetu.com/',

code: 'NumpadEnter',

modifiers: '',

type: 'queryclick',

link: 'input[name*="siori_url"]',

},

{ url: 'syosetu.com/',

code: 'BracketLeft',

modifiers: '',

type: 'url',

link: 'https://syosetu.com/user/top/',

},

{ url: 'syosetu.com/',

code: 'Numpad3',

modifiers: '',

type: 'url',

link: 'https://syosetu.com/user/top/',

},

{ url: 'syosetu.com/',

code: 'BracketLeft',

modifiers: '+',

type: 'url',

link: 'https://syosetu.com/xuser/top/',

},

{ url: 'syosetu.com/',

code: 'Numpad6',

modifiers: '',

type: 'url',

link: 'https://syosetu.com/xuser/top/',

},

{ url: 'syosetu.com/',

code: 'BracketRight',

modifiers: '',

type: 'url',

link: 'https://syosetu.com/favnovelmain/list/',

},

{ url: 'syosetu.com/',

code: 'Numpad2',

modifiers: '',

type: 'url',

link: 'https://syosetu.com/favnovelmain/list/',

},

{ url: 'syosetu.com/',

code: 'BracketRight',

modifiers: '+',

type: 'url',

link: 'https://syosetu.com/favnovelmain18/list/',

},

{ url: 'syosetu.com/',

code: 'Numpad5',

modifiers: '',

type: 'url',

link: 'https://syosetu.com/favnovelmain18/list/',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'ArrowLeft',

modifiers: '',

type: 'a',

link: '前の話',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'NumpadSubtract',

modifiers: '',

type: 'a',

link: '前の話',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'ArrowRight',

modifiers: '',

type: 'a',

link: '次の話',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'NumpadAdd',

modifiers: '',

type: 'a',

link: '次の話',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'Enter',

modifiers: '',

type: 'a',

link: '続きから読む',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'NumpadEnter',

modifiers: '',

type: 'a',

link: '続きから読む',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'Enter',

modifiers: '',

type: 'queryclick',

link: 'span.bookmark.enabled',

},

{ url: 'www.alphapolis.co.jp/novel/',

code: 'NumpadEnter',

modifiers: '',

type: 'queryclick',

link: 'span.bookmark.enabled',

},

{ url: 'www.alphapolis.co.jp/',

code: 'BracketLeft',

modifiers: '',

type: 'url',

link: 'https://www.alphapolis.co.jp/mypage/content',

},

{ url: 'www.alphapolis.co.jp/',

code: 'Numpad3',

modifiers: '',

type: 'url',

link: 'https://www.alphapolis.co.jp/mypage/content',

},

{ url: 'www.alphapolis.co.jp/',

code: 'BracketRight',

modifiers: '',

type: 'url',

link: 'https://www.alphapolis.co.jp/mypage/favorite',

},

{ url: 'www.alphapolis.co.jp/',

code: 'Numpad2',

modifiers: '',

type: 'url',

link: 'https://www.alphapolis.co.jp/mypage/favorite',

},

];

const excludeList = [

['kakuyomu.jp/my/works/', 'new'],

['kakuyomu.jp/my/works/', 'edit'],

['kakuyomu.jp/my/works/', 'episodes'],

['syosetu.com/user', 'input'],

['www.alphapolis.co.jp/mypage/novel/save'],

['x.com'],

];

function eKeyHandler(e) {

switch (e.target.tagName.toLowerCase()) {

case 'input':

case 'textarea':

case 'select':

// disable while input

return;

}

let url = location.href;

for (let i=excludeList.length-1; i>=0; i--) {

let l = excludeList[i];

let r = true;

for (let j=l.length-1; j>=0; j--) {

if (!url.includes(l[j])) { r = false; break; }

}

if (r) return;

}

if (e.code == 'Escape') {

let msg = document.getElementById('_msgFrame');

if (msg != null) {

document.body.removeChild(msg);

}

return;

}

let found = false;

for (let i=list.length-1; i>=0; i--) {

let l = list[i];

if (url.includes(l.url)

&& l.code == e.code

&& l.modifiers.includes('+') == e.shiftKey

&& l.modifiers.includes('^') == e.ctrlKey

&& l.modifiers.includes('!') == e.altKey

&& l.modifiers.includes('#') == e.metaKey) {

switch (l.type) {

case 'a': // search <a> with content matched in innerHTML and jump

{

let els = document.getElementsByTagName('a');

for (let j=els.length-1; j>=0; j--) {

if (els[j].innerHTML.includes(l.link)) {

location.href = els[j].href;

return;

}

}

}

break;

case 'aclick': // search <a> with content matched in innerHTML and click

{

let els = document.getElementsByTagName('a');

for (let j=els.length-1; j>=0; j--) {

if (els[j].innerHTML.includes(l.link)) {

els[j].click();

return;

}

}

}

break;

case 'query': // search by query and jump

{

let el = document.querySelector(l.link);

if (el) {

location.href = el.href;

return;

}

}

break;

case 'queryclick': // search by query and click

{

let el = document.querySelector(l.link);

if (el) {

el.click();

return;

}

}

break;

case 'url': // jump to url

location.href = l.link;

return;

case 'inc': // increase number

location.href = url.replace(new RegExp(l.re), (match, p1) => l.str.replace('$$', Number(p1) + 1));

return;

case 'dec': // decrease number

location.href = url.replace(new RegExp(l.re), (match, p1) => l.str.replace('$$', Number(p1) - 1));

return;

}

found = true;

}

}

if (found) {

let msg = document.getElementById('_msgFrame');

if (msg == null) {

let tmp = document.createElement('div');

tmp.id = '_msgFrame';

tmp.style.display = 'flex';

tmp.style.justifyContent = 'center';

tmp.style.alignItems = 'center';

tmp.style.position = 'fixed';

tmp.style.top = '60px';

tmp.style.right = '60px';

tmp.style.width = '400px';

tmp.style.height = '100px';

tmp.style.pointerEvents = 'none';

tmp.style.backgroundColor = '#fffa';

tmp.style.color = 'red';

tmp.style.fontSize = '72px';

tmp.innerText = 'Not Found';

document.body.appendChild(tmp);

}

}

}

document.addEventListener("keydown", eKeyHandler, false);

})();

///////////////////////////////////////////////////ここまで


操作方法

・カーソルキー左、またはテンキーのマイナス⇒前話を表示

・カーソルキー右、またはテンキーのプラス⇒次話を表示

・ブックマーク一覧でカーソルキー左右、またはテンキーのマイナス/プラス⇒ページめくり

・感想欄でカーソルキー左右、またはテンキーのマイナス/プラス⇒ページめくり

・感想欄でShiftキーを押しながらカーソルキー左右、またはテンキーのマイナス/プラス⇒前話/次話の感想を表示

・表紙でEnterキー、またはテンキーのEnterキー⇒現在読んでいるページを表示

・各話でEnterキー、またはテンキーのEnterキー⇒しおりをここに移動

・@キー、またはテンキーの3⇒ユーザホームを表示

・Shift+@キー、またはテンキーの6⇒Xユーザホームを表示

・[キー、またはテンキーの2⇒ブックマークを表示

・Shift+[キー、またはテンキーの5⇒Xブックマークを表示

・操作が失敗したとき「Not Found」と表示する

・Escキーで「Not Found」を消す


カクヨム、なろう(感想欄含む)、アルファポリスに対応しています。

JavaScript がわかる人はキーをカスタマイズするなどして自分の使いやすいように改造してください。


ご質問があればお気軽にどうぞ。

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ