1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
| link(rel="preconnect" href="//i0.hdslb.com/")
!=page.content
#bangumis .bangumi-tabs#bangumi-top button#wantWatch 想看 button#watching 在看 button#watched 已看
div#inner
.bangumi-tabs#bangumi-bottom button#bottom-first 首页 button#bottom-pre 上一页 p#bottom-num 0/0 button#bottom-next 下一页 button#bottom-end 尾页
script. document.addEventListener('kms:loaded', function fun() { document.removeEventListener('kms:loaded', fun)
const isSupportWebp = (function () { try { return document.createElement('canvas').toDataURL('image/webp', 0.5).indexOf('data:image/webp') === 0; } catch (err) { return false; } })() // 单页卡片数量限制 const maxCount = 10
/** 追加文本 */ function appendText(element, text, clean = false) { text = `(${text})` if (navigator.userAgent.indexOf('Firefox') < 0) element.innerText = clean ? text : element.innerText + text else element.textContent = clean ? text : element.textContent + text }
/** 处理参数 */ function parseArg() { const url = location.href let arg if (url.endsWith('/')) { arg = {id: 'watching', page: 1} } else { arg = JSON.parse(decodeURIComponent(location.hash.substring(1))) // 校对参数 if (!arg.id || (arg.id !== 'watching' && arg.id !== 'wantWatch' && arg.id !== 'watched')) arg.id = 'watching' if (!arg.page || arg.page < 1) arg.page = 1 } sessionStorage.setItem('bangumis', JSON.stringify(arg)) return arg }
/** 初始化页码信息 */ function initPageNumber(json) { appendText(document.getElementById('wantWatch'), json.wantWatch.length) appendText(document.getElementById('watching'), json.watching.length) appendText(document.getElementById('watched'), json.watched.length) }
/** 更新列表内容 */ function update(json, arg, updateURL = true) { const content = json[arg.id] const maxPage = Math.ceil(content.length / maxCount) if (arg.page > maxPage) arg.page = maxPage
const pre = document.getElementById('bottom-pre').classList const next = document.getElementById('bottom-next').classList if (arg.page === 1) pre.add('disable') else pre.remove('disable') if (arg.page === maxPage) next.add('disable') else next.remove('disable')
const pageNum = document.getElementById('bottom-num') appendText(pageNum, `${arg.page} / ${maxPage}`, true)
function buildCard(title, img, href, follow, type, area, play, coin, danmaku, score, tagList, index) { if (!img.startsWith('http')) img = `https://i0.hdslb.com/bfs/bangumi/${img}${isSupportWebp ? '@220w_280h.webp' : ''}` let tags = '' for (let name of tagList) tags += `<p>${name}</p>` // noinspection HtmlUnknownAttribute,HtmlRequiredAltAttribute return `<div class="card" link="${href}" index="${index}"><img src="${img}" referrerpolicy="no-referrer"><div class="info"><a class="title">${title}</a><div class="details"><span class="area"><p>${type}</p><em>${area}</em></span><span class="play"><p>播放量</p><em>${play}</em></span><span class="follow"><p>追番</p><em>${follow}</em></span><span class="coin"><p>硬币</p><em>${coin}</em></span><span class="danmaku"><p>弹幕</p><em>${danmaku}</em></span><span class="score"><p>评分</p><em>${score}</em></span></div><div class="tags">${tags}</div></div></div>` }
let newHTML = '' console.log(content) for (let i = (arg.page - 1) * maxCount, k = 0; k !== maxCount && i !== content.length; ++k, ++i) { const value = content[i] const href = value.id === 0 ? '' : (typeof value.id !== 'number' ? value.id : `https://www.bilibili.com/bangumi/media/md${value.id}/`) newHTML += buildCard(value.title, value.cover, href ?? 0, value.follow ?? '-', value.type ?? '番剧', value.area ?? '日本', value.view ?? '-', value.coin ?? '-', value.danmaku ?? '-', value.score ?? '-', value.tags ?? [], value.index ?? 0) } document.getElementById('inner').innerHTML = newHTML
if (updateURL) location.hash = JSON.stringify(arg) for (let value of document.getElementById('bangumi-top').children) { if (value.id === arg.id) value.classList.add('active') else value.classList.remove('active') } }
/** 注册点击事件 */ function initClick(json, arg) { const top = document.getElementById('bangumi-top') top.addEventListener('click', event => { const element = event.target.id ? event.target : event.target.parentNode if (element.nodeName !== 'BUTTON') return element.classList.add('active') for (let value of top.children) { if (value.id !== element.id) value.classList.remove('active') } arg.id = element.id arg.page = 1 sessionStorage.setItem('bangumis', JSON.stringify(arg)) update(json, arg) }) const bottom = document.getElementById('bangumi-bottom') const height = document.getElementById('page-header').clientHeight bottom.addEventListener('click', event => { const element = event.target.id ? event.target : event.target.parentNode if (element.nodeName !== 'BUTTON' || element.classList.contains('disable')) return btf.scrollToDest(height) switch (element.id) { case 'bottom-first': arg.page = 1 break case 'bottom-end': arg.page = Math.ceil(json[arg.id].length / maxCount) break case 'bottom-next': ++arg.page break case 'bottom-pre': --arg.page break } update(json, arg) }) const card = document.getElementById('inner') card.addEventListener('click', event => { let element = event.target.id ? event.target : event.target.parentNode if (!element.classList.contains('descr')) { while (!element.classList.contains('card')) element = element.parentElement const link = element.getAttribute('link') if (link.length > 0) window.open(link) else btf.snackbarShow('博主没有为这个番剧设置链接~') } }) }
new Promise(resolve => resolve(parseArg())).then(arg => { fetch('/bilibili.json').then(it => it.text().then(it => { const json = JSON.parse(it) const hashchangeTask = () => { const newArg = parseArg() if (newArg !== arg) { arg.id = newArg.id arg.page = newArg.page update(json, arg, false) } } addEventListener('hashchange', hashchangeTask) document.addEventListener('pjax:send', function fun() { window.removeEventListener('hashchange', hashchangeTask) document.removeEventListener('pjax:send', fun) }) addEventListener('beforeunload', function fun() { window.removeEventListener('hashchange', hashchangeTask) window.removeEventListener('beforeunload', fun) }) initClick(json, arg) initPageNumber(json) update(json, arg, false) })) }) })
|