您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
try to take over the world!
// ==UserScript== // @name Sankaku Previewer // @namespace https://greasyfork.org/ja/scripts/370717-sankaku-previewer // @version 1.3 // @description try to take over the world! // @author You // @match https://chan.sankakucomplex.com/* // @grant GM_xmlhttpRequest // ==/UserScript== (function() { const body = document.getElementsByTagName('body')[0] createPreview() addEvent() body.onmousemove = () => { addEvent() } function xpath(path, d){ if(!d) d = document return document.evaluate(path, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null) } function xpathList(nodes, path) { const xpathObj = xpath(path) for (let i = 0; i < xpathObj.snapshotLength; i++){ nodes.push(xpathObj.snapshotItem(i)) } return nodes } let timer function addEvent() { let nodes = [] nodes = xpathList(nodes, "//div[@class='content']//img[not(@preview)]") for(let i = 0; i < nodes.length; i++){ const imgEle = nodes[i] imgEle.setAttribute('preview', '') imgEle.setAttribute('flag', '0') const tags = imgEle.getAttribute('title') if (tags == null || tags.match(/animated/)) {continue} imgEle.removeAttribute('title') //もっとエレガントに imgEle.onmouseover = () => { imgEle.setAttribute('flag', '0') if (imgEle.getAttribute('preview')) { openPreview(imgEle.getAttribute('preview')) } else if (!imgEle.getAttribute('preview')) { const parent = imgEle.parentNode const req = new GM_xmlhttpRequest({ method: "GET", url: parent.href, responseType: 'text', onload: (res) => { const raw_xml = res.response const parser = new DOMParser() const html = parser.parseFromString(raw_xml, "text/html") const img = html.getElementById('lowres') || html.getElementById('highres') if (imgEle.getAttribute('flag') != 0) return const blob_req = new GM_xmlhttpRequest({ method: "GET", url: img.href, responseType: 'blob', onload: (res) => { if (imgEle.getAttribute('flag') != 0) return const img_src = window.URL.createObjectURL(res.response) imgEle.setAttribute('preview', img_src) openPreview(imgEle.getAttribute('preview')) } }) } }) } } imgEle.onmouseout = () => { imgEle.setAttribute('flag', '1') closePreview() } imgEle.setAttribute('preview', '') } } function createPreview() { const preview = document.createElement('img') const content = document.getElementById('content') preview.setAttribute('id', 'sankaku-preview') preview.height = document.documentElement.clientHeight preview.style.pointerEvents = 'none' preview.style.zIndex = '99999' preview.style.opacity = '0.9' preview.style.left = '0px' preview.style.top = '0px' preview.style.position = 'fixed' preview.style.display = 'none' content.appendChild(preview) } function openPreview(src) { const preview = document.getElementById('sankaku-preview') preview.setAttribute('src', src) preview.style.display = 'inline' } function closePreview() { const preview = document.getElementById('sankaku-preview') preview.style.display = 'none' } })();