Greasy Fork

Bilibili 哔哩哔哩阻止动态点击正文跳转

阻止动态点击正文跳转动态页面

当前为 2021-12-18 提交的版本,查看 最新版本

// ==UserScript==
// @name         Bilibili 哔哩哔哩阻止动态点击正文跳转
// @icon         https://t.bilibili.com/favicon.ico
// @namespace    https://lolicon.app/
// @version      1.1.1
// @description  阻止动态点击正文跳转动态页面
// @author       Jindai Kirin
// @match        https://t.bilibili.com/*
// @match        https://space.bilibili.com/*
// @license      MIT
// @grant        GM_addStyle
// ==/UserScript==

(function () {
    'use strict';

    GM_addStyle('.description.active{cursor:unset!important}.up-info-tip:hover{color:#ff85ad!important;cursor:pointer}');

    const contentClassList = ['content-full', 'content-ellipsis', 'content'];

    /**
     * @param {HTMLElement} element
     * @param {string} className
     */
    const hasClass = (element, className) => element.classList.contains(className);
    /**
     * @param {HTMLElement} element
     * @param {string[]} classNameList
     */
    const hasSomeClass = (element, classNameList) => classNameList.some(className => hasClass(element, className));

    /**
     * @param {HTMLElement} element
     */
    const isContentElement = element => hasSomeClass(element, contentClassList) && !hasClass(element.parentElement, 'user-panel');
    /**
     * @param {HTMLElement} element
     */
    const isSkipElement = element => hasClass(element, 'dynamic-link-hover-bg');
    /**
     * @param {HTMLElement} element
     */
    const isNeedClickParentElement = element => hasClass(element, 'lottery-btn');

    document.addEventListener(
        'click',
        e => {
            /** @type {HTMLElement} */
            const $el = e.target;
            // 不处理动态链接
            if (isSkipElement($el)) return;
            // 扩大互动抽奖按钮点击范围(B站自己就没处理好,原本点 icon 是不能打开抽奖面板的)
            if (isNeedClickParentElement($el)) {
                e.stopPropagation();
                e.preventDefault();
                $el.parentElement.click();
                return;
            }
            // 提供转发原文跳转到动态页面的方式
            if (hasClass($el, 'up-info-tip')) {
                try {
                    const did = $el.parentElement.parentElement.parentElement.getAttribute('data-ori-did');
                    if (did) window.open(`https://t.bilibili.com/${did}?tab=2`, '_blank');
                } catch (e) {
                    console.error(e);
                }
            }
            // 阻止点击正文跳转到动态页面
            if (isContentElement($el) || isContentElement(e.composedPath()[1])) {
                e.stopPropagation();
            }
        },
        { capture: true }
    );
})();