左键选中复制

左键选中

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name              左键选中复制
// @description       左键选中
// @version           1.3
// @match             *://*/*
// @grant             unsafeWindow
// @run-at            document-body
// @namespace https://greasyfork.org/users/12375
// ==/UserScript==

(function(uw) {
    'use strict';

    const CTRL_A_MASK = 0b10000001; // 复合位掩码
    const KEY_STATES = new Uint8Array(256);
    const CLIP_WRITE = uw.navigator.clipboard?.writeText ?
        t => uw.navigator.clipboard.writeText(t).catch(()=>GM_setClipboard(t)) :
        t => GM_setClipboard(t);

    let textCache = null, tid = 0;

    const memReadSelection = () => {
        const s = document.getSelection();
        return s && s.toString() || '';
    };

    uw.addEventListener('keydown', e => KEY_STATES[e.keyCode] = e.ctrlKey | (e.keyCode === 65) << 7);
    uw.addEventListener('keyup', () => KEY_STATES.fill(0));

    document.addEventListener('selectionchange', () => {
        if (KEY_STATES[65] & CTRL_A_MASK) return;
        const txt = memReadSelection();
        if (!txt || txt === textCache) return;
        textCache = txt;
        clearTimeout(tid);
        tid = setTimeout(() => CLIP_WRITE(txt), 8);
    }, 0x7FFFFFFF);

})(unsafeWindow);