您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
get the ticket title
// ==UserScript== // @name issue-tools // @namespace http://tampermonkey.net/ // @version 0.9 // @description get the ticket title // @author simpleyzh // @match https://wonder.atlassian.net/browse/** // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // ==/UserScript== (function () { 'use strict'; const text = "{issue_numbers} {title}"; function insertButton() { const header = document.querySelector("._1reoewfl._18m9ewfl._1e0c1txw._4cvr1h6o._16jlkb7n._1looidpf._6myxv47k"); if (!header) return; // 如果已经插过,就不重复插 if (header.querySelector("#my-copy-btn")) return; const btn = document.createElement("button"); btn.id = "my-copy-btn"; btn.style.cssText = "padding-left:10px;font-size:17px;color:white;cursor:pointer;background-color:#0065ff;border-radius:4px;border:0px;"; btn.innerText = "Copy"; btn.addEventListener("click", () => { // 点击时动态获取数据 const data = getCurrentPageData(); if (data) { copyText(data); } else { console.log("未能获取到数据"); } }); header.appendChild(btn); console.log("按钮已插入"); } // 新增函数:动态获取当前页面数据 function getCurrentPageData() { try { const els = document.getElementsByClassName("css-1gd7hga"); if (!els || els.length < 3) { console.log("未找到必要的页面元素"); return null; } let numberStr = ""; for (let i = 2; i < els.length && i < 4; i++) { if (i > 2) { numberStr += '/'; } let issue_number; if (i == els.length - 1) { issue_number = els[i].innerText; } else { let number = els[i].innerText; if (isNaN(Number(number.substring(number.lastIndexOf('-') + 1)))) continue; issue_number = number; } numberStr += issue_number; } const titleEl = document.querySelector("._1mouidpf._1dyz4jg8._1p1dglyw._11c8nf1z._syaz1fxt"); if (!titleEl) { console.log("未找到标题元素"); return null; } let title = titleEl.innerText; // 获取当前时间戳 const timestamp = new Date().toLocaleString(); // 构建返回的数据对象 const pageData = { issue_numbers: numberStr, title: title, timestamp: timestamp, url: window.location.href }; console.log("获取到的数据:", pageData); return text.replace("{issue_numbers}", numberStr).replace("{title}", title); } catch (error) { console.error("获取数据时出错:", error); return null; } } function copyText(value) { if (!value) { console.log("没有数据可复制"); return; } // 使用现代 Clipboard API if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(value).then(() => { console.log("复制成功:", value); showCopySuccess(); }).catch(err => { console.error("复制失败:", err); showCopyFailure(); }); } else { console.error("不支持 Clipboard API 或不在安全上下文中"); showCopyFailure(); } } // 显示复制失败提示 function showCopyFailure() { const btn = document.getElementById("my-copy-btn"); if (btn) { const originalText = btn.innerText; const originalBgColor = btn.style.backgroundColor; btn.innerText = "复制失败"; btn.style.backgroundColor = "#dc3545"; // 红色表示失败 setTimeout(() => { btn.innerText = originalText; btn.style.backgroundColor = originalBgColor || "#008cba8a"; // 恢复原始背景色 }, 2000); } } // 新增函数:显示复制成功提示 function showCopySuccess() { const btn = document.getElementById("my-copy-btn"); if (btn) { const originalText = btn.innerText; const originalBgColor = btn.style.backgroundColor; btn.innerText = "Copied"; btn.style.backgroundColor = "#28a745"; // 绿色表示成功 setTimeout(() => { btn.innerText = originalText; btn.style.backgroundColor = originalBgColor || "#008cba8a"; // 恢复原始背景色 }, 1500); } } // 用 MutationObserver 监听页面变化 const observer = new MutationObserver(() => { insertButton(); }); observer.observe(document.body, { childList: true, subtree: true }); // 初次运行 insertButton(); })();