// ==UserScript== // @name 车牌标注-阿拉伯字符 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 拖拽和复制都正常工作 // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; const chars = [ '٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩', 'ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م', 'ن', 'هـ', 'و', 'ي' ]; const panel = document.createElement('div'); panel.id = 'eg-plate-helper'; panel.innerHTML = `
🇪🇬 阿拉伯字符 (点击复制)
`; const style = document.createElement('style'); style.textContent = ` #eg-plate-helper { position: fixed !important; top: 50px !important; left: 100px !important; width: 280px !important; background: #ffffff !important; border: 1px solid #e0e0e0 !important; border-radius: 8px !important; box-shadow: 0 4px 15px rgba(0,0,0,0.2) !important; z-index: 2147483647 !important; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif !important; overflow: hidden !important; user-select: none !important; pointer-events: auto !important; will-change: transform !important; } #eg-plate-header { display: flex !important; justify-content: space-between !important; align-items: center !important; padding: 8px 12px !important; background: #2563eb !important; color: white !important; font-size: 13px !important; font-weight: bold !important; cursor: move !important; } #eg-plate-toggle { cursor: pointer !important; padding: 0 4px !important; font-size: 16px !important; line-height: 1 !important; pointer-events: auto !important; } #eg-plate-toggle:hover { opacity: 0.8 !important; } #eg-plate-body { display: flex !important; flex-wrap: wrap !important; padding: 8px !important; gap: 6px !important; max-height: 400px !important; overflow-y: auto !important; background: white !important; pointer-events: auto !important; } #eg-plate-body.hidden { display: none !important; } .eg-char-btn { width: 40px !important; height: 40px !important; display: flex !important; align-items: center !important; justify-content: center !important; font-size: 20px !important; background: #f8f9fa !important; border: 1px solid #dee2e6 !important; border-radius: 6px !important; cursor: pointer !important; transition: all 0.15s ease !important; color: black !important; user-select: none !important; pointer-events: auto !important; } .eg-char-btn:hover { background: #eff6ff !important; border-color: #2563eb !important; color: #2563eb !important; transform: translateY(-2px) !important; } .eg-char-btn:active { transform: translateY(0) !important; } .eg-copy-toast { position: fixed !important; top: 20px !important; left: 50% !important; transform: translateX(-50%) translateY(-20px) !important; background: #10b981 !important; color: white !important; padding: 6px 16px !important; border-radius: 4px !important; font-size: 14px !important; z-index: 2147483648 !important; opacity: 0 !important; transition: all 0.3s ease !important; pointer-events: none !important; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif !important; white-space: nowrap !important; } .eg-copy-toast.show { opacity: 1 !important; transform: translateX(-50%) translateY(0) !important; } `; document.head.appendChild(style); document.body.appendChild(panel); const bodyEl = document.getElementById('eg-plate-body'); chars.forEach(char => { const btn = document.createElement('div'); btn.className = 'eg-char-btn'; btn.textContent = char; btn.setAttribute('data-char', char); btn.onclick = (e) => { e.stopPropagation(); e.preventDefault(); const text = e.currentTarget.getAttribute('data-char'); copyChar(text); }; bodyEl.appendChild(btn); }); const toggleBtn = document.getElementById('eg-plate-toggle'); toggleBtn.onclick = (e) => { e.stopPropagation(); if (bodyEl.classList.contains('hidden')) { bodyEl.classList.remove('hidden'); toggleBtn.textContent = '—'; } else { bodyEl.classList.add('hidden'); toggleBtn.textContent = '+'; } }; // 复制函数 - 确保使用正确的 text async function copyChar(text) { console.log('复制:', text); try { await navigator.clipboard.writeText(text); showToast(`已复制: ${text}`); } catch (err) { // 降级方案 const textarea = document.createElement('textarea'); textarea.value = text; textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '-9999px'; textarea.style.opacity = '0'; document.body.appendChild(textarea); textarea.select(); textarea.setSelectionRange(0, textarea.value.length); try { const success = document.execCommand('copy'); if (success) { showToast(`已复制: ${text}`); } else { showToast(`复制失败,请手动复制`); } } catch (e) { showToast(`复制失败,请手动复制`); } document.body.removeChild(textarea); } } let toastTimeout; function showToast(msg) { let toast = document.querySelector('.eg-copy-toast'); if (!toast) { toast = document.createElement('div'); toast.className = 'eg-copy-toast'; document.body.appendChild(toast); } toast.textContent = msg; toast.classList.add('show'); clearTimeout(toastTimeout); toastTimeout = setTimeout(() => toast.classList.remove('show'), 1200); } // ========== 拖拽功能(不影响点击) ========== let isDragging = false; let dragStartX = 0, dragStartY = 0; let currentTranslateX = 0, currentTranslateY = 0; let initialTranslateX = 0, initialTranslateY = 0; let hasMoved = false; const header = document.getElementById('eg-plate-header'); function getCurrentTransform() { const transform = window.getComputedStyle(panel).transform; if (transform === 'none') { return { x: 0, y: 0 }; } const matrix = transform.match(/matrix\(([^)]+)\)/); if (matrix) { const values = matrix[1].split(', '); return { x: parseFloat(values[4]) || 0, y: parseFloat(values[5]) || 0 }; } return { x: 0, y: 0 }; } function onMouseMove(e) { if (!isDragging) return; e.preventDefault(); const dx = e.clientX - dragStartX; const dy = e.clientY - dragStartY; currentTranslateX = initialTranslateX + dx; currentTranslateY = initialTranslateY + dy; panel.style.transform = `translate(${currentTranslateX}px, ${currentTranslateY}px)`; panel.style.top = 'auto'; panel.style.left = 'auto'; panel.style.right = 'auto'; panel.style.bottom = 'auto'; hasMoved = true; } function onMouseUp() { if (!isDragging) return; isDragging = false; document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); document.body.style.userSelect = ''; // 延迟重置,避免拖拽后立即触发点击 setTimeout(() => { hasMoved = false; }, 10); } function onMouseDown(e) { // 如果点击的是 toggle 按钮,不拖拽 if (e.target === toggleBtn || toggleBtn.contains(e.target)) { return; } e.preventDefault(); isDragging = true; hasMoved = false; dragStartX = e.clientX; dragStartY = e.clientY; const transform = getCurrentTransform(); initialTranslateX = transform.x; initialTranslateY = transform.y; document.body.style.userSelect = 'none'; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); } header.addEventListener('mousedown', onMouseDown); // 确保按钮点击不会被拖拽干扰 panel.addEventListener('click', (e) => { if (hasMoved) { e.stopPropagation(); } }); })();