您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically copy selected text to clipboard and keep the selection
当前为
- // ==UserScript==
- // @name Auto Copy Selected Text
- // @namespace http://tampermonkey.net/
- // @version 1.4
- // @description Automatically copy selected text to clipboard and keep the selection
- // @author liuweiqing
- // @match *://*/*
- // @grant none
- // @license MIT
- // @icon https://icons.iconarchive.com/icons/gartoon-team/gartoon-places/256/user-desktop-icon.png
- // ==/UserScript==
- (function () {
- ("use strict");
- // 监听鼠标松开的事件
- document.addEventListener("mouseup", () => {
- const selection = window.getSelection();
- const selectedText = selection.toString();
- if (selectedText) {
- const range = selection.getRangeAt(0);
- if (navigator.clipboard) {
- navigator.clipboard
- .writeText(selectedText)
- .then(() => {
- console.log("Text copied to clipboard:", selectedText);
- })
- .catch((err) => {
- console.error("Failed to copy text to clipboard", err);
- });
- } else {
- const tempElement = document.createElement("textarea");
- tempElement.value = selectedText;
- document.body.appendChild(tempElement);
- tempElement.select();
- try {
- document.execCommand("copy");
- console.log("Text copied to clipboard:", selectedText);
- } catch (err) {
- console.error("Failed to copy text to clipboard", err);
- }
- document.body.removeChild(tempElement);
- }
- selection.removeAllRanges();
- selection.addRange(range);
- }
- });
- // 监听鼠标中键点击事件,粘贴剪贴板内容
- document.addEventListener("mousedown", async (event) => {
- if (event.button === 1) {
- // 中键点击
- event.preventDefault();
- event.stopPropagation();
- try {
- const text = await navigator.clipboard.readText();
- // 获取点击位置的元素
- const targetElement = document.elementFromPoint(
- event.clientX,
- event.clientY
- );
- if (targetElement && isEditable(targetElement)) {
- // 设置焦点并模拟正常输入
- forceFocus(targetElement);
- pasteIntoInput(targetElement, text);
- } else {
- // 如果不是输入框,则尝试插入到其他可编辑区域
- document.execCommand("insertText", false, text);
- }
- } catch (err) {
- console.error("Failed to read clipboard contents: ", err);
- }
- }
- });
- // 检查元素是否可编辑
- function isEditable(element) {
- return (
- element.tagName === "INPUT" ||
- element.tagName === "TEXTAREA" ||
- element.isContentEditable
- );
- }
- // 尝试强制获得焦点
- function forceFocus(element) {
- try {
- element.focus(); // 尝试直接聚焦
- // 如果还没有焦点,再尝试更强制的方式
- if (document.activeElement !== element) {
- const focusEvent = new FocusEvent("focus", {
- bubbles: true,
- cancelable: true,
- });
- element.dispatchEvent(focusEvent);
- }
- } catch (e) {
- console.error("Failed to focus on element: ", e);
- }
- }
- // 模拟正常输入
- function pasteIntoInput(element, text) {
- // 如果支持 `execCommand`
- if (document.execCommand) {
- element.focus();
- document.execCommand("insertText", false, text);
- } else {
- // 如果不支持 `execCommand`,直接使用事件
- const inputEvent = new InputEvent("input", {
- bubbles: true,
- cancelable: true,
- data: text,
- inputType: "insertText",
- });
- element.dispatchEvent(inputEvent);
- }
- }
- })();