玩转CSDN

仅供参考学习

目前為 2021-09-07 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        玩转CSDN
// @namespace     http://tampermonkey.net/
// @version     0.1001
// @match        *://blog.csdn.net/*
// @icon        https://source.unsplash.com/random
// @description   仅供参考学习
// @author        wwwbh
// @icon        https://www.google.com/s2/favicons?domain=csdn.net
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    class CSDN{
        construct(focusSwitch){
            console.log('构造方法');
        };

        /*
        @name    复制
        @func
            modifyCopyPriviledge: 修改权限
            copy: 复制逻辑
        */
        modifyCopyPriviledge(codeElem,signElem){
            //代码容器修改
            codeElem.removeAttribute('onclick');
            codeElem.style.setProperty('user-select','auto');
            codeElem.setAttribute('id','code-'+i);
            codeElem.parentNode.style.setProperty('user-select','auto');
            // 登录容器修改
            signElem.removeAttribute('onclick');
            signElem.setAttribute('data-title','点击复制');
            signElem.removeAttribute('data-report-click');
            signElem.setAttribute('data-clipboard-action','copy');
            signElem.setAttribute('aria-label','copied!');
            signElem.setAttribute('data-clipboard-target','#code-'+i);
        };
        copy(signElem) {
            let codeelem = null;
            try{
                codeelem = signElem.parentNode;
                if(codeelem.id.indexOf('code')===-1){ // 父节点
                    throw new EvalError('值错误');
                }
            }catch(err){// 兄弟节点
                codeelem = signElem.previousElementSibling;
            }
            document.oncopy=function(e){
                e.clipboardData.setData('text',codeelem.innerText);
                e.preventDefault();
                document.oncopy=null;
            }
            document.execCommand("Copy");// 执行浏览器复制命令
            signElem.setAttribute('data-title','复制成功');
            signElem.style.cssText += 'background-color: green';
            setTimeout(()=>{ // 先延时1000ms,再执行回调函数
                signElem.setAttribute('data-title','点击复制');
                signElem.style.removeProperty('background-color','green');
            },1000);
        };
        /*
        @name 专注模式
        @func
            modifyFocusPriviledge: 修改专注权限
            showFocusModel: 展开专注模式
        */
        modifyFocusPriviledge(mainBox, main){
            // 修改toolbar
            let toolbar = document.querySelector('.csdn-side-toolbar');
            let focusSwitch = document.querySelector('.option-box').cloneNode(true);
            focusSwitch.firstElementChild.src = 'https://s1.aigei.com/src/img/png/05/055f0df239ef4451a25be1e5c4617f96.png?imageMogr2/auto-'+
                'orient/thumbnail/!199x199r/gravity/Center/crop/199x199/quality/85/&e=1735488000&'+
                'token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:pxpJ0L3fOUppABVi15gOFs94eqk=';
            focusSwitch.style.background = "rgba(0,0,0,0.1)";
            focusSwitch.firstElementChild.style.width = "200%";
            focusSwitch.firstElementChild.style.display = "block"; // 去除初始鼠标放上有动态加载事件
            // focusSwitch.lastElementChild.innerHTML = "专注<br/>模式";
            focusSwitch.removeChild(focusSwitch.lastElementChild);
            toolbar.replaceChildren(focusSwitch);
            // 修改默认页面配置样式
            main.removeAttribute('id');
            focusSwitch.removeAttribute('mouseup');
            mainBox.firstElementChild.nextElementSibling.style.removeProperty('z-index');
            main.style.cssText += 'z-index:999;position:absolute';
            main.style.display = 'none';
            document.body.insertBefore(main, document.body.firstElementChild);
            return focusSwitch;
        };
        showFocusModel(status, mainBox, main){
            if(status===0){ // 进入专注模式
                console.log(`----${status}: 专注模式----`)
                mainBox.style.display = 'none';
                mainBox.nextElementSibling.style.display = 'none';
                main.style.display = 'block';
                console.log('主体可见\n全体不可见')
                // rightAside.style.setProperty('display','none');
                // mainBox.firstElementChild.style.setProperty('display','auto');
                // con.replaceChildren(mainBox.firstElementChild);
            }else{ // 默认-1 原始状态
                console.log(`----${status}: 初始模式----`);
                mainBox.style.display = 'block';
                mainBox.nextElementSibling.style.display = 'block';
                main.style.display = 'none';
                console.log('主体不可见\n全体可见')
                // mainBox.style.removeProperty('display','none');
                // rightAside.style.removeProperty('display','none');
                // con.replaceChildren(mainBox);
                // con.append(rightAside);

            }
            // document.body.replaceChild(mainContent,nodata);
        }
    };

    let csdn = new CSDN();
    let mainBox = document.getElementById('mainBox');
    let main = mainBox.firstElementChild.cloneNode(true);
    let focusSwitch = csdn.modifyFocusPriviledge(mainBox, main); //
    let status = -1;
    focusSwitch.addEventListener('click', function(){
        status = ~status;
        csdn.showFocusModel(status,mainBox,main);
    },'true');
    let codes = document.querySelectorAll('#content_views pre code');
    let signs = document.querySelectorAll('.signin');
    for(var i=0;i<codes.length;i++){
        let sign = signs[i];
        // 代码容器权限修改
        csdn.modifyCopyPriviledge(codes[i], signs[i]);
        // 增加登录元素的点击事件(捕获-由子到根)
        sign.addEventListener('click', function(){
            csdn.copy(this);
        },'true');
    };
})();