百度搜索美化: 百度去广告、自动翻页、界面美化、多列展示

顶部工具栏毛玻璃效果、底部分页栏悬浮、搜索结果添加边框、搜索结果多列、隐藏工具栏、隐藏分页并自动加载下一页

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         百度搜索美化: 百度去广告、自动翻页、界面美化、多列展示
// @name:zh-CN   百度搜索美化: 百度去广告、自动翻页、界面美化、多列展示
// @namespace    baidu_beautify
// @version      4.5
// @description  顶部工具栏毛玻璃效果、底部分页栏悬浮、搜索结果添加边框、搜索结果多列、隐藏工具栏、隐藏分页并自动加载下一页
// @description:zh-CN  顶部工具栏毛玻璃效果、底部分页栏悬浮、搜索结果添加边框、搜索结果多列、隐藏工具栏、隐藏分页并自动加载下一页
// @author       Xavier Wong
// @run-at       document-start
// @match        https://www.baidu.com/
// @match        https://www.baidu.com/s*
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

/**
 * 修改指定DOM
 * @param domSelector DOM选择器
 * @param style 样式
 */
function modifyDOM(domSelector, style){
    GM_addStyle(
        domSelector + '{' + style + '}'
    );
}

/**
 * 隐藏指定DOM
 * @param domSelector DOM选择器
 */
function hideDOM(domSelector){
    GM_addStyle(
        domSelector + '{display: none !important;}'
    );
}

/**
 * 判断DOM包含类
 * @param domSelector DOM选择器
 * @param className 类名
 */
function containDOMClass(domSelector, className){
    const dom = getDOM(domSelector);
    if(dom) {
        return dom.classList.contains(className);
    } else {
        return false;
    }
}

/**
 * 替换DOM类
 * @param domSelector DOM选择器
 * @param className 类名
 */
function replaceDOMClass(domSelector, oldClassName, newClassName){
    const dom = getDOMs(domSelector);
    getDOMs(domSelector).forEach(function(r){
        r.classList.add(newClassName);
        r.classList.remove(oldClassName);
    });
}

/**
 * 获取单个DOM
 * @param domSelector DOM选择器
 * @returns DOM
 */
function getDOM(domSelector, retryTime) {
    return document.querySelector(domSelector);
}

/**
 * 获取多个DOM
 * @param domSelector DOM选择器
 * @returns DOMs
 */
function getDOMs(domSelector) {
    return document.querySelectorAll(domSelector);
}

/**
 * 删除多个DOM
 * @param domSelector DOM选择器
 */
function deleteDOMs(domSelector) {
    getDOMs(domSelector).forEach(function(r){
        r.remove();
    });
}

/**
 * 移动DOM
 * @param srcDomSelector 来源DOM选择器
 * @param dstDomSelector 目标DOM选择器
 */
function moveBeforeDOM(srcDomSelector, dstDomSelector) {
    const srcDom = getDOM(srcDomSelector);
    const dstDom = getDOM(dstDomSelector);
    if(srcDom != null && dstDom != null) {
        dstDom.before(srcDom);
    }
}


/**
 * 添加设置分割线
 */
function addSettingSplit() {
    const splitLine = generateExtraSettingElement('cursor: default;', '丨');
    getDOM('#u').prepend(splitLine);
}

/**
 * 添加单列/双列模式切换按钮
 */
var isSingle = GM_getValue('isSingle', true);
function toggleSingleCol(single) {
    if(single) {
        GM_addStyle('#content_left{width: 100% !important; display: grid !important;}');
        GM_addStyle('#content_left>div{width: calc(100% - 76px) !important;}');
        GM_addStyle('[tpl="short_video"] .c-gap-top>div>.c-row{display: inline-flex; margin-right: 16px}');
        GM_addStyle('#content_right{display: none}');
    } else {
        GM_addStyle('#content_left{width: 100% !important; display: flex !important; flex-wrap: wrap !important;}');
        GM_addStyle('#content_left>div{width: calc(50% - 76px) !important;}');
        GM_addStyle('[tpl="short_video"] .c-gap-top>div>.c-row{display: block; margin-right: unset}');
        GM_addStyle('#content_right{display: none}');
    }
    isSingle = single;
    GM_setValue('isSingle', isSingle);
}
function addColumnToggleButton() {
    const singleColumnButton = generateExtraSettingElement(isSingle ? 'display: none' : 'display: inline-flex', '单列模式');
    const multiColumnButton = generateExtraSettingElement(!isSingle ? 'display: none' : 'display: inline-flex', '双列模式');
    singleColumnButton.onclick = function(){
        toggleSingleCol(true);
        singleColumnButton.style = 'display: none';
        multiColumnButton.style = 'display: inline-flex';
    }
    multiColumnButton.onclick = function(){
        toggleSingleCol(false);
        singleColumnButton.style = 'display: inline-flex';
        multiColumnButton.style = 'display: none';
    }
    getDOM('#u').prepend(singleColumnButton);
    getDOM('#u').prepend(multiColumnButton);
}

/**
 * 添加分页模式切换按钮
 */
var isPage = GM_getValue('isPage', false);
function togglePageOn(show) {
    if(show) {
        modifyDOM('#page', 'visibility: visible');
    } else {
        modifyDOM('#page', 'visibility: hidden');
    }
    isPage = show;
    GM_setValue('isPage', isPage);
}
function addPageToggleButton() {
    const pageOnButton = generateExtraSettingElement(isPage ? 'display: none' : 'display: inline-flex', '开启分页');
    const pageOffButton = generateExtraSettingElement(!isPage ? 'display: none' : 'display: inline-flex', '关闭分页');
    pageOnButton.onclick = function(){
        togglePageOn(true);
        pageOnButton.style = 'display: none';
        pageOffButton.style = 'display: inline-flex';
    }
    pageOffButton.onclick = function(){
        togglePageOn(false);
        pageOnButton.style = 'display: inline-flex';
        pageOffButton.style = 'display: none';
    }
    getDOM('#u').prepend(pageOnButton);
    getDOM('#u').prepend(pageOffButton);
}

/**
 * 添加工具栏开关按钮
 */
var isTool = GM_getValue('isTool', true);
function toggleToolOn(show) {
    if(show) {
        modifyDOM('#s_tab', 'height: 38px');
    } else {
        modifyDOM('#s_tab', 'height: 11px');
    }
    isTool = show;
    GM_setValue('isTool', isTool);
}
function addToolToggleButton() {
    const toolOnButton = generateExtraSettingElement(isTool ? 'display: none' : 'display: inline-flex', '显示分类');
    const toolOffButton = generateExtraSettingElement(!isTool ? 'display: none' : 'display: inline-flex', '隐藏分类');
    toolOnButton.onclick = function(){
        toggleToolOn(true);
        toolOnButton.style = 'display: none';
        toolOffButton.style = 'display: inline-flex';
    }
    toolOffButton.onclick = function(){
        toggleToolOn(false);
        toolOnButton.style = 'display: inline-flex';
        toolOffButton.style = 'display: none';
    }
    getDOM('#u').prepend(toolOnButton);
    getDOM('#u').prepend(toolOffButton);
}

function generateExtraSettingElement(style, btnTxt){
    const tmpDiv = document.createElement('div');
    tmpDiv.innerHTML = '<a href="javascript:;" style="' + style + '" >' + btnTxt + '</a>';
    return tmpDiv.firstElementChild;
}

function generateScrollToTopElement(){
    const tmpDivA = document.createElement("div");
    tmpDivA.id = 'scrollToTopA';
    tmpDivA.classList.add('scrollToTop');
    tmpDivA.style = 'position: fixed; bottom: 80px; border-radius: 50%; cursor: pointer; height: 44px; width: 44px; align-items: center; justify-content: center; box-shadow: 0 2px 4px 0 rgba(0,0,0,.05)';
    tmpDivA.innerHTML = '<img src="https://g.csdnimg.cn/side-toolbar/3.4/images/fanhuidingbucopy.png" style="width: 24px;">';
    tmpDivA.onclick = function() {
        window.scrollTo({
            left: 0,
            top: 0,
            behavior: 'smooth'
        });
    };
    getDOM('html').appendChild(tmpDivA);
    replaceDOMClass('.scrollToTop', 'show', 'hide');
}

function init() {
    // 导航栏样式,毛玻璃效果
    modifyDOM('#head', 'background-color: rgba(248,248,248,0.4)');
    modifyDOM('.head_wrapper', 'width: 90%');
    modifyDOM('.s_form', 'backdrop-filter: blur(10px);');
    hideDOM('[tpl="app/search-tag"]');
    // 工具栏样式, 透明效果
    toggleToolOn(isTool);
    modifyDOM('#s_tab', 'border-bottom: #e0e0e0 1px solid; background-color: rgba(248,248,248,0.4) !important; overflow: hidden;')
    modifyDOM('.s_tab_inner', 'background-color: rgba(248,248,248,0.4)');
    // 去除右侧
    hideDOM('#content_right');
    toggleSingleCol(isSingle);
    modifyDOM('#container.sam_newgrid', 'margin-right: 150px; width: auto; margin-bottom:45px');
    togglePageOn(isPage);
    GM_addStyle(
        '.new-pmd .c-span8{width: calc(100% - 192px) !important}' +
        '.new-pmd .c-span9{width: calc(100% - 144px) !important}' +
        '.new-pmd .c-span12{width: 100% !important}' +
        // 内容卡美化
        '#content_left>div{margin-right:44px !important;margin-bottom:20px !important;border-radius:12px !important;padding:16px !important;-webkit-box-shadow: 0 2px 5px 0 rgba(0,0,0,.1) !important;}' +
        '#content_left>table{margin-right:44px !important;margin-bottom:20px !important;border-radius:12px !important;-webkit-box-shadow: 0 2px 5px 0 rgba(0,0,0,.1) !important;}' +
        '#content_left>table>tbody>tr>td{padding:16px !important}' +
        '#content_left>table>tbody>tr>td>div{width:560px !important;-webkit-box-shadow:unset !important;border: none !important;padding: 0 !important}' +
        '.c-border{-webkit-box-shadow:unset !important;margin-bottom: 0 !important;border: none !important}' +
        '[class*="single-card-wrapper"] {margin: -46px -16px -16px; padding: 46px 16px 10px 16px !important; box-shadow: unset !important}' +
        '[class*=content-border] {box-shadow: unset !important}' +
        '.wd-ai-index-pc {margin: -16px !important; width: unset !important}' +
        '.new-pmd.c-container {width: fit-content !important}' +
        // 隐藏相关搜索&其他人在搜
        '#rs_new, [tpl=recommend_list], [tpl=app\\/footer], div[data-click="{"]{display: none !important}' +
        // 分页栏样式
        '#page{position:fixed; bottom:0; width:100%;}' +
        '#page > div{padding: 5px 15px !important; margin: 5px 0 5px 140px !important;}'
    );
    GM_addStyle(
        '#scrollToTopA{right: 50px}' +
        '.scrollToTop.show{display: flex}' +
        '.scrollToTop.hide{display: none}'
    );
    if(getDOM('#su')) getDOM('#su').onclick = function() {currentUrl = document.location.href; currentPage = getUrlParam("pn");}
    if(getDOM('#kw')) getDOM('#kw').onkeydown = function() {if(event.keyCode==13) {currentUrl = document.location.href; currentPage = getUrlParam("pn");}}

}

function getUrlParam(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) return unescape(r[2]); return null;
}
var currentUrl = document.location.href;
var currentPage = getUrlParam("pn");
function loadNextPage(){
    showToast('加载中...');
    var xhr = new XMLHttpRequest();
    var nextPageUrl;
    var nextPage;
    if(currentPage == null){
        currentPage = 0;
        nextPage = 10;
        if(document.querySelectorAll("#page .n").length===2){
            nextPageUrl = document.querySelectorAll("#page .n")[1].href;
        }else{
            nextPageUrl = document.querySelectorAll("#page .n")[0].href;
        }
    }else{
        nextPage = currentPage + 10;
        nextPageUrl = currentUrl.replace('&pn='+currentPage, '&pn='+nextPage)
    }
    xhr.open("GET", nextPageUrl);
    xhr.send();
    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4 && xhr.status === 200){
            var parser = new DOMParser();
            var doc = parser.parseFromString(xhr.responseText, "text/html");
            var results = doc.querySelectorAll('.result');
            for (var i = 0; i < results.length; i++) {
                document.querySelector('#content_left').appendChild(results[i])
            }
            showToast('已加载第' + (nextPage/10 + 1) + '页');
            let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
            let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
            if(clientHeight == scrollHeight) {
                loadNextPage();
            }
        }
    }
    currentUrl = nextPageUrl;
    currentPage= nextPage;
}

function scrollToTopF(){
    window.scrollTo({
        left: 0,
        top: 0,
        behavior: 'smooth'
    });
}
function showToast(msg){
    deleteDOMs('#pageLoaded');
    var m = document.createElement('div');
    m.id = 'pageLoaded';
    m.innerHTML = msg;
    m.style = "padding:0 14px; height: 40px; color: white; line-height: 40px; text-align: center; border-radius: 10px; position: fixed; bottom: 5%; left: 50%; transform: translate(-50%, -50%); z-index: 999; background: rgba(0, 0, 0, 0.7); font-size: 16px;";
    document.body.appendChild(m);
    setTimeout(function() {
        var d = 0.5;
        m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
        m.style.opacity = '0';
    }, 500);
}

(
    function() {
        'use strict';
        init();

        document.addEventListener('DOMContentLoaded',function(e){
            generateScrollToTopElement();
            addSettingSplit();
            addToolToggleButton();
            addPageToggleButton();
            addColumnToggleButton();
        });
        window.onload = function(){
            // 添加观察者,监控样式变化
            var observer = new MutationObserver(function() {
                init();
            });
            observer.observe(document.querySelector('#wrapper'), {
                attributes: true
            });
        }
        window.onscroll = function(){
            let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
            let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
            if(scrollTop <= 200) {
                replaceDOMClass('.scrollToTop', 'show', 'hide');
            }
            if(scrollTop > 200) {
                replaceDOMClass('.scrollToTop', 'hide', 'show');
            }
            if(!isPage) {
                if((scrollHeight > clientHeight) && (scrollTop + clientHeight >= scrollHeight)) {
                    loadNextPage();
                }
            }
        }
    }
)();