得奇小说网,看单个章节免翻页
目前為
// ==UserScript== // @name Deqi Prefech // @namespace https://greasyfork.org/zh-CN/users/14997-lrh3321 // @version 2025-07-17 // @description 得奇小说网,看单个章节免翻页 // @author LRH3321 // @license MIT // @tag novels // @match https://www.deqixs.com/pifu/ // @match https://www.deqixs.com/xiaoshuo/*/*.html // @match https://www.deqixs.com/xiaoshuo/*/ // @icon https://www.google.com/s2/favicons?sz=64&domain=deqixs.com // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/handsontable.full.min.js // @resource htcss https://cdn.jsdelivr.net/npm/handsontable/styles/handsontable.min.css // @resource ht_main_css https://cdn.jsdelivr.net/npm/handsontable/styles/ht-theme-main.min.css // @resource ht_horizon_css https://cdn.jsdelivr.net/npm/handsontable/styles/ht-theme-horizon.min.css // @grant GM_setValue // @grant GM_getValue // @grant GM_getResourceURL // @grant GM_addStyle // @grant GM_addElement // @grant unsafeWindow // @run-at document-end // ==/UserScript== (function () { // 'use strict'; const isInIframe = window.self !== window.top; // 是否伪装成代码 let disguiseMode = GM_getValue('disguise-mode', 'none'); let codeLang = GM_getValue('code-lang', 'javascript'); const defaultCodeSnippet = `var x = 1; switch (x) { case 1: console.log('x 等于1'); case 2: console.log('x 等于2'); default: console.log('x 等于其他值'); } ==== switch (x) { case 1: console.log('x 等于1'); break; case 2: console.log('x 等于2'); break; default: console.log('x 等于其他值'); } ==== switch (1 + 3) { case 2 + 2: f(); break; default: neverHappens(); } ==== var x = 1; switch (x) { case true: console.log('x 发生类型转换'); break; default: console.log('x 没有发生类型转换'); } `; let fakeCodeSnippet = GM_getValue('fake-codes', defaultCodeSnippet); const avalibleCodeThemes = [ { Name: 'Default', code: 'prism' }, { Name: 'Dark', code: 'prism-dark' }, { Name: 'Funky', code: 'prism-funky' }, { Name: 'Okaidia', code: 'prism-okaidia' }, { Name: 'Twilight', code: 'prism-twilight' }, { Name: 'Coy', code: 'prism-coy' }, { Name: 'Solarized Light', code: 'prism-solarizedlight' }, { Name: 'Tomorrow Night', code: 'prism-tomorrow' }, // A wider selection of Prism themes { Name: 'CB', code: 'prism-cb' }, { Name: 'GHColors', code: 'prism-ghcolors' }, { Name: 'Pojoaque', code: 'prism-pojoaque' }, { Name: 'Xonokai', code: 'prism-xonokai' }, { Name: 'Ateliersulphurpool-light', code: 'prism-base16-ateliersulphurpool.light' }, { Name: 'Hopscotch', code: 'prism-hopscotch' }, { Name: 'Atom Dark', code: 'prism-atom-dark' }, { Name: 'Duotone Dark', code: 'prism-duotone-dark' }, { Name: 'Duotone Sea', code: 'prism-duotone-sea' }, { Name: 'Duotone Space', code: 'prism-duotone-space' }, { Name: 'Duotone Earth', code: 'prism-duotone-earth' }, { Name: 'Duotone Forest', code: 'prism-duotone-forest' }, { Name: 'Duotone Light', code: 'prism-duotone-light' }, { Name: 'VS', code: 'prism-vs' }, { Name: 'VS Code Dark+', code: 'prism-vsc-dark-plus' }, { Name: 'Darcula', code: 'prism-darcula' }, { Name: 'a11y Dark', code: 'prism-a11y-dark' }, { Name: 'Dracula', code: 'prism-dracula' }, { Name: "Synthwave '84", code: 'prism-synthwave84' }, { Name: 'Shades of Purple', code: 'prism-shades-of-purple' }, { Name: 'Material Dark', code: 'prism-material-dark' }, { Name: 'Material Light', code: 'prism-material-light' }, { Name: 'Material Oceanic', code: 'prism-oceanic' }, { Name: 'Nord', code: 'prism-nord' }, { Name: 'Coldark Cold', code: 'prism-coldark-cold' }, { Name: 'Coldark Dark', code: 'prism-coldark-dark' }, { Name: 'Coy without shadows', code: 'prism-coy-without-shadows' }, { Name: 'Gruvbox Dark', code: 'prism-gruvbox-dark' }, { Name: 'Gruvbox Light', code: 'prism-gruvbox-light' }, { Name: 'Lucario', code: 'prism-lucario' }, { Name: 'Night Owl', code: 'prism-night-owl' }, { Name: 'Holi Theme', code: 'prism-holi-theme' }, { Name: 'Z-Touch', code: 'prism-z-touch' }, { Name: 'Solarized Dark Atom', code: 'prism-solarized-dark-atom' }, { Name: 'One Dark', code: 'prism-one-dark' }, { Name: 'One Light', code: 'prism-one-light' }, { Name: 'Laserwave', code: 'prism-laserwave' } ]; const avalibleCodeLanguages = [ { Name: 'Markup — markup, html, xml, svg, mathml, ssml, atom, rss', code: 'markup' }, { Name: 'CSS — css', code: 'css' }, { Name: 'C-like — clike', code: 'clike' }, { Name: 'JavaScript — javascript, js', code: 'javascript' } ]; const avalibleSheetThemes = [ { Name: 'Main', code: 'ht-theme-main' }, { Name: 'Main Dark', code: 'ht-theme-main-dark' }, { Name: 'Main Dark Auto', code: 'ht-theme-main-dark-auto' }, { Name: 'Horizon', code: 'ht-theme-horizon' }, { Name: 'Horizon Dark', code: 'ht-theme-horizon-dark' }, { Name: 'Horizon Dark Auto', code: 'ht-theme-horizon-dark-auto' } ]; let codeTheme = GM_getValue('code-theme', 'prism'); let sheetTheme = GM_getValue('sheet-theme', 'ht-theme-horizon-dark-auto'); // console.log(codeTheme, sheetTheme); // let sheetTheme = GM_getValue('sheet-theme', 'ht-theme-horizon'); let codeThemeElement = null; function getCodeThemeURL(theme) { const officialThemes = new Set([ 'prism', 'prism-dark', 'prism-funky', 'prism-okaidia', 'prism-twilight', 'prism-coy', 'prism-solarizedlight', 'prism-tomorrow' ]); if (officialThemes.has(theme)) { return `https://dev.prismjs.com/themes/${theme}.min.css`; } return `https://cdnjs.cloudflare.com/ajax/libs/prism-themes/1.9.0/${theme}.min.css`; } let italicStyle = null; function disableItalicComment() { italicStyle = GM_addStyle(`span.token.comment { font-style: normal; }`); } if (!isInIframe) { codeThemeElement = GM_addElement(document.head, 'link', { href: getCodeThemeURL(codeTheme), rel: 'stylesheet', type: 'text/css' }); GM_addElement(document.head, 'link', { href: GM_getResourceURL('htcss'), rel: 'stylesheet', type: 'text/css' }); GM_addElement(document.head, 'link', { href: GM_getResourceURL('ht_main_css'), rel: 'stylesheet', type: 'text/css' }); GM_addElement(document.head, 'link', { href: GM_getResourceURL('ht_horizon_css'), rel: 'stylesheet', type: 'text/css' }); GM_addStyle(`.ht-wrapper div { margin: initial; }`); if (!GM_getValue('code-italic', true)) { disableItalicComment(); } } let refreshInterval = GM_getValue('refreshInterval', 15 * 60000); function changeCodeTheme(theme) { GM_setValue('code-theme', theme); codeTheme = theme; codeThemeElement === null || codeThemeElement === void 0 ? void 0 : codeThemeElement.remove(); codeThemeElement = GM_addElement(document.head, 'link', { href: getCodeThemeURL(theme), rel: 'stylesheet', type: 'text/css' }); // document.body.style.backgroundColor = ''; } function changeSheetTheme(theme) { GM_setValue('sheet-theme', theme); sheetTheme = theme; if (hot) { hot.useTheme(theme); } } let bookPageAccessKey = GM_getValue('bookPageAccessKey', 'h'); let previousChapterAccessKey = GM_getValue('previousChapterAccessKey', 'b'); let nextChapterAccessKey = GM_getValue('nextChapterAccessKey', 'n'); function createAccessKeysFieldset() { const accessKeysFieldset = document.createElement('fieldset'); accessKeysFieldset.innerHTML = `<legend>快捷键设置 <a href="https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Global_attributes/accesskey#%E5%B0%9D%E8%AF%95%E4%B8%80%E4%B8%8B" target="_blank" style="margin-left: 5rem;">快捷键使用帮助</a> </legend> <div style="display: flex;gap: 1rem;"> <label>上一章: <select id="previousChapterAccessKey"></select> </label> <label>目录: <select id="bookPageAccessKey"></select> </label> <label>下一章: <select id="nextChapterAccessKey"></select> </label> </div>`; const previousChapterAccessKey = accessKeysFieldset.querySelector('#previousChapterAccessKey'); const bookPageAccessKey = accessKeysFieldset.querySelector('#bookPageAccessKey'); const nextChapterAccessKey = accessKeysFieldset.querySelector('#nextChapterAccessKey'); for (let i = 0; i < 10; i++) { const option = document.createElement('option'); const charCode = 48 + i; // '0' is 97 in ASCII option.value = String.fromCharCode(charCode); option.text = String.fromCharCode(charCode); previousChapterAccessKey.appendChild(option); bookPageAccessKey.appendChild(option.cloneNode(true)); nextChapterAccessKey.appendChild(option.cloneNode(true)); } for (let i = 0; i < 26; i++) { const option = document.createElement('option'); const charCode = 97 + i; // 'a' is 97 in ASCII option.value = String.fromCharCode(charCode); option.text = String.fromCharCode(charCode); previousChapterAccessKey.appendChild(option); bookPageAccessKey.appendChild(option.cloneNode(true)); nextChapterAccessKey.appendChild(option.cloneNode(true)); } bookPageAccessKey.value = GM_getValue('bookPageAccessKey', 'h'); previousChapterAccessKey.value = GM_getValue('previousChapterAccessKey', 'b'); nextChapterAccessKey.value = GM_getValue('nextChapterAccessKey', 'n'); previousChapterAccessKey.onchange = (e) => { if (previousChapterAccessKey.selectedOptions.length > 0) { GM_setValue('previousChapterAccessKey', previousChapterAccessKey.value); } }; bookPageAccessKey.onchange = (e) => { if (bookPageAccessKey.selectedOptions.length > 0) { GM_setValue('bookPageAccessKey', bookPageAccessKey.value); } }; nextChapterAccessKey.onchange = (e) => { if (nextChapterAccessKey.selectedOptions.length > 0) { GM_setValue('nextChapterAccessKey', nextChapterAccessKey.value); } }; return accessKeysFieldset; } function createDisguiseCodeFieldset() { const disguiseFieldset = document.createElement('fieldset'); const codeThemeInput = document.createElement('select'); codeThemeInput.name = 'theme'; avalibleCodeThemes.forEach((theme) => { const option = document.createElement('option'); option.value = theme.code; option.text = theme.Name; codeThemeInput.appendChild(option); }); codeThemeInput.value = codeTheme; codeThemeInput.onchange = () => { console.log('change'); const theme = codeThemeInput.value; if (codeThemeInput.selectedIndex >= 0 && theme && theme != codeTheme) { console.log(`Change code theme to ${theme}`); changeCodeTheme(theme); } }; const codeThemeLabel = document.createElement('label'); codeThemeLabel.innerText = '代码主题:'; codeThemeLabel.appendChild(codeThemeInput); disguiseFieldset.appendChild(codeThemeLabel); const codeLangInput = document.createElement('select'); codeLangInput.name = 'lang'; avalibleCodeLanguages.forEach((theme) => { const option = document.createElement('option'); option.value = theme.code; option.text = theme.Name; codeLangInput.appendChild(option); }); codeLangInput.value = codeLang; codeLangInput.onchange = () => { console.log('change'); if (codeLangInput.selectedIndex >= 0) { const lang = codeLangInput.value; GM_setValue('code-lang', lang); } }; const codeLangLabel = document.createElement('label'); codeLangLabel.innerText = '代码语言:'; codeLangLabel.style.marginLeft = '0.5rem'; codeLangLabel.appendChild(codeLangInput); disguiseFieldset.appendChild(codeLangLabel); const codeItalicInput = document.createElement('input'); codeItalicInput.type = 'checkbox'; codeItalicInput.name = 'font-italic'; codeItalicInput.checked = GM_getValue('code-italic', true); codeItalicInput.onchange = () => { const checked = codeItalicInput.checked; GM_setValue('code-italic', checked); if (checked) { if (italicStyle) { italicStyle.remove(); italicStyle = null; } } else { disableItalicComment(); } }; const codeItalicLabel = document.createElement('label'); codeItalicLabel.style.marginLeft = '0.5rem'; codeItalicLabel.appendChild(codeItalicInput); codeItalicLabel.append(' 小说斜体'); disguiseFieldset.appendChild(codeItalicLabel); const demoCodeTitle = document.createElement('h3'); demoCodeTitle.innerText = '主题效果:'; disguiseFieldset.appendChild(demoCodeTitle); const preDemo = document.createElement('pre'); preDemo.innerHTML = `<code class="language-javascript"><span class="token comment">/* 让我们说中文 */</span> <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token parameter">bar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 短的注释</span> <span class="token keyword">var</span> a <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token string">'Prism'</span><span class="token punctuation">;</span> <span class="token keyword">return</span> a <span class="token operator">+</span> <span class="token function">bar</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code>`; preDemo.className = 'language-javascript'; disguiseFieldset.appendChild(preDemo); const fakeCodeSnippetTitle = document.createElement('h3'); fakeCodeSnippetTitle.innerText = '伪装用代码段(代码块间使用 “====” 分割):'; disguiseFieldset.appendChild(fakeCodeSnippetTitle); const textarea = document.createElement('textarea'); textarea.name = 'fake-code-snippet'; textarea.placeholder = '伪装用代码段(代码块间使用 “====” 分割)'; textarea.style.padding = '0.5rem'; textarea.rows = 20; textarea.value = fakeCodeSnippet; textarea.style.width = '100%'; disguiseFieldset.appendChild(textarea); textarea.onchange = () => { GM_setValue('fake-codes', textarea.value); }; return disguiseFieldset; } function createDisguiseSheetFieldset() { const disguiseFieldset = document.createElement('fieldset'); const sheetThemeInput = document.createElement('select'); sheetThemeInput.name = 'sheet-theme'; avalibleSheetThemes.forEach((theme) => { const option = document.createElement('option'); option.value = theme.code; option.text = theme.Name; sheetThemeInput.appendChild(option); }); sheetThemeInput.value = sheetTheme; sheetThemeInput.onchange = () => { console.log('change'); const theme = sheetThemeInput.value; if (sheetThemeInput.selectedIndex >= 0 && theme && theme != sheetTheme) { console.log(`Change sheet theme to ${theme}`); changeSheetTheme(theme); } }; const sheetThemeLabel = document.createElement('label'); sheetThemeLabel.innerText = '表格主题:'; sheetThemeLabel.appendChild(sheetThemeInput); disguiseFieldset.appendChild(sheetThemeLabel); return disguiseFieldset; } function createSettingForm() { const form = document.createElement('form'); const intervalInput = document.createElement('input'); intervalInput.type = 'number'; intervalInput.min = '0'; intervalInput.valueAsNumber = refreshInterval / 60000; intervalInput.style.width = '4rem'; const intervalLabel = document.createElement('label'); intervalLabel.innerText = '刷新间隔(分钟):'; intervalLabel.appendChild(intervalInput); form.appendChild(intervalLabel); const button = document.createElement('button'); button.type = 'submit'; button.innerText = '保存刷新设置'; button.style.marginLeft = '0.75rem'; form.appendChild(button); form.appendChild(createAccessKeysFieldset()); const disguiseCodeFieldset = createDisguiseCodeFieldset(); const disguiseSheetFieldset = createDisguiseSheetFieldset(); const updateFieldSetsState = (label) => { switch (label) { case 'none': disguiseCodeFieldset.style.display = 'none'; disguiseSheetFieldset.style.display = 'none'; break; case 'code': disguiseCodeFieldset.style.display = 'block'; disguiseSheetFieldset.style.display = 'none'; break; case 'sheet': disguiseCodeFieldset.style.display = 'none'; disguiseSheetFieldset.style.display = 'block'; break; } }; updateFieldSetsState(disguiseMode); const radioDiv = document.createElement('div'); radioDiv.style.display = 'flex'; radioDiv.innerHTML = `<p>伪装模式:</p>`; [ ['none', '无'], ['code', '代码'], ['sheet', '表格'] ].forEach(([label, placeholder]) => { const disguiseInput = document.createElement('input'); disguiseInput.name = 'disguise-radio'; disguiseInput.type = 'radio'; disguiseInput.value = label; disguiseInput.checked = disguiseMode == label; disguiseInput.style.marginLeft = '0.5rem'; disguiseInput.style.marginRight = '0.5rem'; disguiseInput.onchange = () => { const disguiseEnabled = disguiseInput.checked; // GM_setValue('disguise', disguiseEnabled); if (disguiseEnabled) { GM_setValue('disguise-mode', label); updateFieldSetsState(label); } }; const disguiseLabel = document.createElement('label'); disguiseLabel.style.display = 'flex'; disguiseLabel.style.alignItems = 'center'; disguiseLabel.appendChild(disguiseInput); const disguiseP = document.createElement('p'); disguiseP.innerText = placeholder; disguiseLabel.appendChild(disguiseP); radioDiv.appendChild(disguiseLabel); }); form.appendChild(radioDiv); form.appendChild(disguiseCodeFieldset); form.appendChild(disguiseSheetFieldset); form.onsubmit = (e) => { e.preventDefault(); const interval = parseInt(intervalInput.value) * 60000; if (interval >= 0 && interval != refreshInterval) { GM_setValue('refreshInterval', interval); refreshInterval = interval; } }; return form; } function handleBookPage() { let finished = false; const itemtxt = document.querySelector('.itemtxt'); const spans = Array.from(itemtxt.querySelectorAll('p > span')); spans.forEach((span) => { var _a; if (((_a = span.textContent) === null || _a === void 0 ? void 0 : _a.trim()) == '已完结') { finished = true; } }); const settingAnchor = document.createElement('a'); settingAnchor.href = '/pifu/'; settingAnchor.style.float = 'right'; settingAnchor.style.marginRight = '0.5rem'; settingAnchor.innerText = '脚本设置'; itemtxt.firstElementChild.appendChild(settingAnchor); if (!finished) { const title = itemtxt.querySelector('h1>a').textContent; const latestChapter = itemtxt.querySelector('ul>li>a').textContent; const current = document.createElement('p'); current.innerText = `当前时间:${new Date().toTimeString()}`; itemtxt.appendChild(current); document.title = `${title} - ${latestChapter}`; if (refreshInterval > 0) { const next = document.createElement('p'); next.innerText = `刷新时间:${new Date(Date.now() + refreshInterval).toTimeString()}`; itemtxt.appendChild(next); setTimeout(() => { location.reload(); }, refreshInterval); } } } function handleSettingPage() { const settingForm = createSettingForm(); const container = document.querySelector('div.container'); container.appendChild(settingForm); } function disguiseToCode(container) { if (fakeCodeSnippet.trim() == '') { fakeCodeSnippet = defaultCodeSnippet; } const fakeCodes = fakeCodeSnippet.split('===='); const getRandomCode = () => fakeCodes[Math.floor(Math.random() * fakeCodes.length)]; var lines = []; const paragraphs = Array.from(container.querySelectorAll('p')); const code = document.createElement('code'); code.className = `language-${codeLang}`; code.style.whiteSpace = 'pre-wrap'; code.style.textWrap = 'pretty'; code.style.overflowX = 'auto'; let blockCommentStart = '/*'; let blockCommentEnd = '*/'; let shortCommnet = ''; switch (codeLang) { case 'clike': case 'javascript': shortCommnet = '// '; break; default: break; } paragraphs.forEach((p) => { const textContent = p.textContent.trim(); let line = ''; while (line.trim() == '') { if (lines.length == 0) { lines.push(...getRandomCode().split(/[\r]?\n/)); } line = lines.shift(); } const trimed = line.replace(/^[\s\t]+/, ''); if (trimed !== line) { const prefix = line.substring(0, line.length - trimed.length); if (textContent.length < 20 && shortCommnet != '') { code.append(`${prefix}${shortCommnet}${textContent}\n`); } else { code.append(`${prefix}${blockCommentStart}\n${prefix} ${textContent}\n${prefix}${blockCommentEnd}\n`); } } else { if (textContent.length < 20 && shortCommnet != '') { code.append(`${shortCommnet}${textContent}\n`); } else { code.append(`${blockCommentStart}\n ${textContent}\n${blockCommentEnd}\n`); } } code.append(line); code.append('\n'); p.remove(); }); lines.forEach((line) => { code.append(line); code.append('\n'); }); const pre = document.createElement('pre'); pre.style.whiteSpace = 'pre-wrap'; pre.style.textWrap = 'pretty'; pre.style.overflowX = 'auto'; pre.className = `language-${codeLang}`; pre.appendChild(code); container.parentElement.replaceChild(pre, container); GM_addElement('script', { src: 'https://dev.prismjs.com/prism.js' }); } let hot; let sheetData = [['', 'Tesla', 'Volvo', 'Toyota', 'Ford']]; function disguiseToSheet(container) { const paragraphs = Array.from(container.querySelectorAll('p')); paragraphs.forEach((p, i) => { var _a; const textContent = (_a = p.textContent) === null || _a === void 0 ? void 0 : _a.trim(); sheetData.push([textContent, i, 11, 12, 13]); p.remove(); }); if (typeof hot === 'undefined') { const ele = document.createElement('div'); hot = new Handsontable(ele, { data: sheetData, // rowHeaders: false, // colHeaders: false, rowHeaders: true, colHeaders: true, height: 'auto', width: 'auto', autoWrapRow: true, autoWrapCol: true, readOnly: true, themeName: sheetTheme, licenseKey: 'non-commercial-and-evaluation' // for non-commercial use only }); container.parentElement.appendChild(ele); } else { hot.updateData(sheetData); } hot.refreshDimensions(); } function disguiseParagraphs(container) { switch (disguiseMode) { case 'sheet': disguiseToSheet(container); break; case 'code': default: // 伪装成代码 disguiseToCode(container); break; } } function handleChaperPage() { const container = document.querySelector('div.container'); if (location.pathname.includes('-') && container && isInIframe) { const con = container.querySelector('div.con'); let nextHref = ''; let nextChapter = ''; const prenexts = document.querySelectorAll('div.prenext a'); for (const element of prenexts) { if (element instanceof HTMLAnchorElement) { if (element.textContent == '下一页') { nextHref = element.href; break; } if (element.textContent == '下一章') { nextChapter = element.href; break; } } } window.parent.postMessage({ con: con.innerHTML, next: nextHref, nextChapter: nextChapter, href: location.href }); return; } const prenexts = container.querySelectorAll('div.prenext a'); window.addEventListener('message', (e) => { if (e.data.con) { const next = document.createElement('div'); next.className = 'con'; next.innerHTML = e.data.con; const container = document.querySelector('div.container .con'); next.querySelectorAll('p').forEach((p) => container.appendChild(p)); } if (e.data.next) { const iframe = document.querySelector('iframe'); if (iframe) { // iframe.src = e.data.next; iframe.contentWindow.location.replace(e.data.next); } } else { console.debug('no next'); if (!isInIframe && disguiseMode != 'none') { const container = document.querySelector('div.container .con'); disguiseParagraphs(container); } const iframe = document.querySelector('iframe'); if (iframe) { iframe.remove(); } const nextChapter = e.data.nextChapter; if (nextChapter) { for (const element of prenexts) { if (element instanceof HTMLAnchorElement) { if (element.textContent == '下一页') { element.href = nextChapter; if (nextChapter.endsWith('.html')) { element.innerText = '下一章'; element.accessKey = nextChapterAccessKey; } else { element.innerText = '返回目录'; } break; } } } } } }); for (const element of prenexts) { if (element instanceof HTMLAnchorElement) { if (element.textContent == '下一页') { const next = document.createElement('iframe'); next.src = element.href; next.style.display = 'none'; container && container.appendChild(next); } else if (element.textContent == '上一章') { element.accessKey = previousChapterAccessKey; } else if (element.textContent == '目录') { element.accessKey = bookPageAccessKey; } } } } if (location.pathname === '/pifu/') { handleSettingPage(); } else if (location.pathname.endsWith('.html')) { handleChaperPage(); } else { handleBookPage(); } })();