// ==UserScript== // @name 铁军有我 // @namespace http://tampermonkey.net/ // @version 2.1.0.4 // @description 中石化考试答题状态 // @author wangyongqi // @match https://sia.sinopec.com/mobile/* // @grant none // ==/UserScript== (function() { 'use strict'; // 配置项 - 迷你原点样式 const config = { dotSize: '10px', // 原点尺寸 position: { bottom: '20px', // 距离底部距离 left: '20px' // 距离左侧距离 }, zIndex: 99999, // 确保显示在最上层 correctColor: '#4CAF50', // 正确状态颜色 errorColor: '#F44336', // 错误状态颜色 defaultColor: '#BDBDBD' // 默认/未答状态颜色 }; // 注入原点样式 const style = document.createElement('style'); style.textContent = ` .mini-answer-dot { width: ${config.dotSize}; height: ${config.dotSize}; border-radius: 50%; position: fixed; bottom: ${config.position.bottom}; left: ${config.position.left}; z-index: ${config.zIndex}; transition: background-color 0.3s ease; box-shadow: 0 0 2px rgba(0,0,0,0.3); } .dot-correct { background-color: ${config.correctColor}; } .dot-error { background-color: ${config.errorColor}; } .dot-default { background-color: ${config.defaultColor}; } `; document.head.appendChild(style); // 状态管理 const state = { currentDot: null, lastStatus: null, // 记录上一次状态,避免重复更新 targetElement: null // 当前激活题目的状态元素 }; // 创建迷你原点 function createMiniDot() { const dot = document.createElement('div'); dot.className = 'mini-answer-dot dot-default'; dot.title = '未答题'; // 鼠标悬停提示 document.body.appendChild(dot); state.currentDot = dot; return dot; } // 更新原点状态 function updateDotStatus(status) { if (!state.currentDot) return; // 避免重复更新相同状态 if (state.lastStatus === status) return; // 移除所有状态类 state.currentDot.classList.remove('dot-correct', 'dot-error', 'dot-default'); // 添加新状态类并更新提示 switch(status) { case 'correct': state.currentDot.classList.add('dot-correct'); state.currentDot.title = '当前题正确'; break; case 'error': state.currentDot.classList.add('dot-error'); state.currentDot.title = '当前题错误'; break; default: state.currentDot.classList.add('dot-default'); state.currentDot.title = '未答题/状态未知'; } state.lastStatus = status; } // 处理当前题目状态变化 function handleCurrentQuestionStatus() { // 查找当前可见的状态元素(优先处理最新激活的题目) const visibleStatusElements = Array.from( document.querySelectorAll('.que-status') ).filter(el => { const style = window.getComputedStyle(el); return style.display !== 'none' && style.visibility !== 'hidden'; }); if (visibleStatusElements.length === 0) { // 没有可见元素时检查所有状态元素的类名 const allStatusElements = document.querySelectorAll('.que-status'); for (const el of allStatusElements) { if (el.classList.contains('is-pass')) { updateDotStatus('correct'); return; } else if (el.classList.contains('is-error')) { updateDotStatus('error'); return; } } // 无任何状态时显示默认 updateDotStatus('default'); return; } // 处理可见的状态元素(最新的在最后) const latestElement = visibleStatusElements[visibleStatusElements.length - 1]; if (latestElement.classList.contains('is-pass')) { updateDotStatus('correct'); } else if (latestElement.classList.contains('is-error')) { updateDotStatus('error'); } else { updateDotStatus('default'); } } // 初始化DOM观察器 function initObserver() { const observerOptions = { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }; const observer = new MutationObserver(mutations => { // 每次变化都检查当前题目状态 handleCurrentQuestionStatus(); }); observer.observe(document.body, observerOptions); return observer; } // 初始化函数 function init() { // 创建左下角迷你原点 createMiniDot(); // 初始检查状态 handleCurrentQuestionStatus(); // 监听页面滚动和点击,更新当前题目状态 document.addEventListener('scroll', () => { setTimeout(handleCurrentQuestionStatus, 100); }); document.addEventListener('click', () => { setTimeout(handleCurrentQuestionStatus, 100); }); // 启动观察器 initObserver(); // 路由变化监听(单页应用适配) let lastUrl = window.location.href; setInterval(() => { if (window.location.href !== lastUrl) { lastUrl = window.location.href; setTimeout(() => { // 页面切换后重置状态 state.lastStatus = null; handleCurrentQuestionStatus(); }, 500); } }, 1000); console.log('[迷你答题提示] 脚本初始化完成,左下角10x10原点已显示'); } // 启动脚本 init(); })();