// ==UserScript== // @name juejin掘金小帮手 // @name:zh-CN 掘金小帮手:掘金纯净复制、掘金纯净小册阅读 // @namespace http://tampermonkey.net/ // @version 0.3.0 // @description 掘金纯净复制、掘金纯净小册阅读 // @author zzailianlian // @require https://code.jquery.com/jquery-3.5.1.min.js // @match *://juejin.cn/* // @match *://juejin.im/* // @icon https://www.google.com/s2/favicons?sz=64&domain=meitun-test.com // @license MIT // @run-at document-idle // @grant GM_setValue // @grant GM_getValue // @grant GM_addElement // @downloadURL none // ==/UserScript== (function () { 'use strict'; // 复制去除后缀 [...document.querySelectorAll('*')].forEach( item => (item.oncopy = function (e) { e.stopPropagation(); }) ); // 沉浸式小册阅读 const openJuejinPamphlethelper = () => { if (/juejin\.[cnim]{2}.+\/section/.test(window.location.href)) { // 处理沉浸式时要处理的dom列表 const displayDoms = [ { observer: () => document.querySelector('.book-summary'), action: () => { document.querySelector('.book-summary').style.display = 'none'; }, unset: () => { document.querySelector('.book-summary').style = ''; }, }, { observer: () => document.querySelector('.book-content__header'), action: () => { document.querySelector('.book-content__header').style.display = 'none'; }, unset: () => { document.querySelector('.book-content__header').style = ''; }, }, { observer: () => document.querySelector('.book-comments'), action: () => { document.querySelector('.book-comments').style.display = 'none'; }, unset: () => { document.querySelector('.book-comments').style = ''; }, }, { observer: () => document.querySelector('.book-body'), action: () => { document.querySelector('.book-body').style.paddingTop = '0'; }, unset: () => { document.querySelector('.book-body').style = ''; }, }, { observer: () => document.querySelector('.book-content'), action: () => { document.querySelector('.book-content').style.marginLeft = '0'; }, unset: () => { document.querySelector('.book-content').style = ''; }, }, { observer: () => document.querySelector('.book-section-view'), action: () => { document.querySelector('.book-section-view').style.maxWidth = 'unset'; }, unset: () => { document.querySelector('.book-section-view').style = ''; }, }, { observer: () => document.querySelector('.book-handle'), action: () => { document.querySelector('.book-handle').style.maxWidth = 'unset'; document.querySelector('.book-handle').style.marginLeft = '0'; }, unset: () => { document.querySelector('.book-handle').style = ''; }, }, ]; // 沉浸式控制按钮 loopDom({ observer: () => document.querySelector('.book-handle'), action: () => { document.querySelector('.book-handle').style.maxWidth = 'unset'; document.querySelector('.book-handle').style.marginLeft = '0'; const bookHandle = document.querySelector('.book-handle'); let isTrigger = false; const immersionBtn = document.createElement('div'); immersionBtn.innerHTML = '恢复'; immersionBtn.style = `background-color:#007fff;border-radius:50%;width:50px;height:50px;display:flex;justify-content:center;align-items:center;z-index:10;cursor:pointer;color:white;position:absolute;left:10px;font-size:14px;bottom:70px;`; immersionBtn.onclick = function () { console.log('isTrigger', isTrigger); if (isTrigger) { // 沉浸阅读界面 displayDoms.map(dom => { loopDom(dom, 'active'); }); immersionBtn.innerHTML = '恢复'; } else { // 默认展示界面 displayDoms.map(dom => { loopDom(dom, 'disabled'); }); immersionBtn.innerHTML = '沉浸'; } isTrigger = !isTrigger; }; immersionBtn.classList.add('step-btn', 'step-btn--prev'); bookHandle.insertBefore(immersionBtn, bookHandle.firstChild); }, }); displayDoms.map(dom => { loopDom(dom, 'active'); }); } }; window.onload = () => { var _wr = function (type) { var orig = history[type]; return function () { var rv = orig.apply(this, arguments); var e = new Event(type); e.arguments = arguments; window.dispatchEvent(e); return rv; }; }; window.addEventListener('replaceState', function (e) { console.log('监听自定义replaceState', e); openJuejinPamphlethelper(); }); window.addEventListener('pushState', function (e) { console.log('监听自定义pushState', e); openJuejinPamphlethelper(); }); history.pushState = _wr('pushState'); history.replaceState = _wr('replaceState'); openJuejinPamphlethelper(); }; function loopDom({ observer, action = () => {}, unset = () => {} }, type = 'active') { console.log('observer', observer()); const hadnler = () => { if (type === 'active') { action(); } else { unset(); } // 干掉document的title,让阅读不被others打扰 document.title = 'LinStaMIDIAccess'; }; if (observer()) { hadnler(); } const interval = setInterval(() => { console.log('observer2', observer()); if (observer()) { hadnler(); clearInterval(interval); } }, 200); } })();