// ==UserScript== // @name 铁军有我test // @namespace http://tampermonkey.net/ // @version 2.1.04 // @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', // 默认/未答状态颜色 autoNextDelay: 100 // 答对后延迟多久点击下一题(毫秒) }; // 注入原点样式 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, // 当前激活题目的状态元素 autoNextTriggered: false // 标记是否已触发自动下一题,避免重复点击 }; // 创建迷你原点 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 = '当前题正确'; // 重置自动下一题触发状态,为下一次答对做准备 state.autoNextTriggered = false; // 当题目正确且未触发过自动下一题时,准备点击下一题 setTimeout(tryAutoNextQuestion, config.autoNextDelay); break; case 'error': state.currentDot.classList.add('dot-error'); state.currentDot.title = '当前题错误'; // 错误状态重置自动触发标记 state.autoNextTriggered = false; break; default: state.currentDot.classList.add('dot-default'); state.currentDot.title = '未答题/状态未知'; // 默认状态重置自动触发标记 state.autoNextTriggered = false; } state.lastStatus = status; } // 尝试自动点击下一题,适配不同题目类型 function tryAutoNextQuestion() { // 如果已经触发过自动下一题,或者当前状态不是正确,则不执行 if (state.autoNextTriggered || state.lastStatus !== 'correct') { return; } // 1. 先尝试查找第一题的下一题元素 let nextButton = document.querySelector('li.next_btn[data-v-13b10448=""]'); // 2. 如果没找到第一题的下一题元素,再尝试查找第二题及以后的下一题元素 if (!nextButton) { nextButton = document.querySelector('span.next[data-v-13b10448=""]'); } if (nextButton) { // 输出找到的按钮类型,方便调试 const buttonType = nextButton.tagName === 'LI' ? '第一题的下一题按钮' : '第二题及以后的下一题按钮'; console.log(`[迷你答题提示] 检测到正确答案,准备点击${buttonType}`); // 模拟点击下一题 nextButton.click(); state.autoNextTriggered = true; console.log('[迷你答题提示] 已点击下一题'); } else { console.log('[迷你答题提示] 未找到下一题按钮'); } } // 处理当前题目状态变化 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; state.autoNextTriggered = false; handleCurrentQuestionStatus(); }, 500); } }, 1000); console.log('[迷你答题提示] 脚本初始化完成,左下角10x10原点已显示'); console.log('[迷你答题提示] 自动下一题功能已启用,支持第一题和后续题目不同元素'); } // 启动脚本 init(); })();