// ==UserScript== // @name 点云标注-绕过下拉直接赋值完整版 // @namespace http://tampermonkey.net/ // @version 4.2 // @description F2快捷键:打开弹窗,直接设置下拉为属性错误,跳过展开下拉,直接点确定,不操作备注 // @author You // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); // 获取工具栏第5个按钮,数组下标4 function getTargetCommentBtn() { const toolBtns = document.querySelectorAll('div[role="toolbar"] button,.toolbar button'); const btnArr = Array.from(toolBtns); const targetBtn = btnArr[4]; if(targetBtn){ const rect = targetBtn.getBoundingClientRect(); if(rect.width>15 && rect.height>15){ return targetBtn; } } return null; } // 等待元素出现 async function waitElement(selector, timeout=4500){ const start = Date.now(); while(Date.now()-start < timeout){ const el = document.querySelector(selector); if(el) return el; await sleep(150); } return null; } // 根据文本查找DOM function findByText(text){ const all = document.querySelectorAll('*'); for(let el of all){ if(el.textContent && el.textContent.trim() === text){ return el; } } return null; } // 模拟鼠标点击 async function realClick(el){ if(!el) return; const rect = el.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; el.dispatchEvent(new MouseEvent('mouseover', {clientX:x, clientY:y, bubbles:true})); await sleep(80); el.dispatchEvent(new MouseEvent('mousedown', {clientX:x, clientY:y, bubbles:true})); await sleep(80); el.dispatchEvent(new MouseEvent('mouseup', {clientX:x, clientY:y, bubbles:true})); await sleep(80); el.dispatchEvent(new MouseEvent('click', {clientX:x, clientY:y, bubbles:true})); if(typeof el.click === "function") el.click(); } async function runTask(){ console.log("\n=====【开始批注任务|绕过下拉点击】====="); // 1、打开批注弹窗 const triggerBtn = getTargetCommentBtn(); if(!triggerBtn){ console.error("❌找不到工具栏批注按钮"); return; } await realClick(triggerBtn); await sleep(1000); const dialog = await waitElement('div[role="dialog"]'); if(!dialog){ console.error("❌批注弹窗未弹出"); return; } console.log("✅弹窗已打开"); // 2、直接操作下拉内部input,不点开下拉面板 const comboboxInput = dialog.querySelector('div[role="combobox"] input'); if(!comboboxInput){ console.error("❌未找到下拉组件内部input"); return; } comboboxInput.value = "属性错误"; comboboxInput.dispatchEvent(new Event('input', { bubbles: true })); comboboxInput.dispatchEvent(new Event('change', { bubbles: true })); await sleep(1000); console.log("✅已直接设置类型:属性错误"); // 3、直接点击确定提交,备注完全不处理 const okBtn = findByText("确定"); if(!okBtn){ console.error("❌找不到确定按钮"); return; } console.log("✅点击确定提交"); await realClick(okBtn); console.log("=====✅整套流程执行完毕====="); } // F2快捷键绑定 document.addEventListener('keydown', async function(e){ if(e.key === 'F2'){ e.preventDefault(); await runTask(); } }); console.log("✅脚本加载完成|选中目标框,按下F2执行"); })();