// ==UserScript== // @name 点云标注·精简完整版 // @namespace http://tampermonkey.net/ // @version 5.6 // @description 手动弹出【指定标签批注】弹窗,按F2;只执行到识别下拉容器为止,删除下拉之后全部逻辑 // @author You // @match *://*/* // @grant none // ==/UserScript== (function () { 'use strict'; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); async function waitElement(selector, timeout = 5000) { const start = Date.now(); while (Date.now() - start < timeout) { const el = document.querySelector(selector); if (el) return el; await sleep(150); } return null; } async function realClick(el) { const rect = el.getBoundingClientRect(); const opts = { clientX: rect.left + rect.width / 2, clientY: rect.top + rect.height / 2, bubbles: true, cancelable: true }; el.dispatchEvent(new MouseEvent('mouseover', opts)); await sleep(50); el.dispatchEvent(new MouseEvent('mousedown', opts)); await sleep(50); el.dispatchEvent(new MouseEvent('mouseup', opts)); await sleep(50); el.dispatchEvent(new MouseEvent('click', opts)); } function keyDownEv(el, key) { el.dispatchEvent(new KeyboardEvent('keydown', { key: key, bubbles: true })); } async function runTask() { console.log("\n========== F2任务开始 =========="); const dialog = await waitElement('div[role="dialog"]'); if (!dialog) { console.error("❌未识别弹窗,请手动打开弹窗后按F2"); return; } console.log("✅识别批注弹窗"); let selectWrap = null; const nodes = dialog.querySelectorAll('*'); for (const n of nodes) { if (n.textContent?.includes('请选择')) { selectWrap = n; break; } } if (!selectWrap) { console.error("❌未识别下拉容器"); return; } console.log("✅定位下拉容器,展开"); await realClick(selectWrap); await sleep(900); keyDownEv(selectWrap, 'ArrowDown'); await sleep(1300); // 删除下拉之后:属性错误、确定按钮整套逻辑全部移除,运行到此结束 console.log("✅已执行下拉展开,后续逻辑已移除,任务结束"); } document.addEventListener('keydown', async e => { if (e.key === 'F2') { e.preventDefault(); await runTask(); } }); console.log("✅脚本就绪:手动打开弹窗,弹窗出现后按F2;仅执行打开下拉,后续逻辑已删除"); })();