Greasy Fork is available in English.

Universal Text Force-Select

Completely overrides selection blocks and link-dragging to allow text selection everywhere.

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name        Universal Text Force-Select
// @version     2.1
// @author      Dunamis
// @namespace   https://dunamiss.xyz
// @license     MIT
// @description Completely overrides selection blocks and link-dragging to allow text selection everywhere.
// @match       *://*/*
// @grant       GM_addStyle
// @run-at      document-start
// ==/UserScript==

(function() {
    'use strict';

    // Force the browser to treat all text as selectable via CSS
    const css = `
        * {
            -webkit-user-select: text !important;
            -moz-user-select: text !important;
            -ms-user-select: text !important;
            user-select: text !important;
        }
        a {
            cursor: text !important;
        }
    `;

    // Inject CSS as early as possible
    if (typeof GM_addStyle !== 'undefined') {
        GM_addStyle(css);
    } else {
        const style = document.createElement('style');
        style.textContent = css;
        document.head.appendChild(style);
    }

    let isSelecting = false;
    let startX, startY;

    // Stop sites from "grabbing" the link to drag it as an icon
    document.addEventListener('dragstart', (e) => {
        e.preventDefault();
        return false;
    }, true);

    document.addEventListener('mousedown', (e) => {
        if (e.button === 0) { // Left click only
            startX = e.pageX;
            startY = e.pageY;
            isSelecting = false;
        }
    }, true);

    document.addEventListener('mousemove', (e) => {
        if (startX !== undefined) {
            const moveX = Math.abs(e.pageX - startX);
            const moveY = Math.abs(e.pageY - startY);
            if (moveX > 4 || moveY > 4) {
                isSelecting = true;
            }
        }
    }, true);

    document.addEventListener('click', (e) => {
        if (isSelecting) {
            // If the user was highlighting text, don't follow the link
            const target = e.target.closest('a');
            if (target) {
                e.preventDefault();
                e.stopImmediatePropagation();
            }
        }
        // Reset for next click
        startX = undefined;
        isSelecting = false;
    }, true);

})();