// ==UserScript== // @name 中南林课程分数信息查看-全平台通用 // @namespace https://github.com/jinnianliuxing/ // @version 0.2 // @description 在具体成绩页面点击蓝色成绩即可进入查看,恢复隐藏的成绩链接并隐藏原始不可点击的成绩。电脑端保留美化样式,手机端采用优化样式。 // @match http://jwgl.webvpn.csuft.edu.cn/jsxsd/kscj/* // @match http://jwgl.csuft.edu.cn/jsxsd/kscj/* // @icon https://raw.githubusercontent.com/jinnianliuxing/my-script-icons/refs/heads/main/IMG_20250723_163318.png // @run-at document-end // @grant GM_xmlhttpRequest // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; // 设备检测函数 function isMobileDevice() { return window.innerWidth <= 768 || /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } const isMobile = isMobileDevice(); // 添加全局样式(根据设备自适应) if (isMobile) { // 移动端美化样式(借鉴融合版) GM_addStyle(` .mobile-score-link { display: inline-block; vertical-align: middle; line-height: normal; padding: 8px 14px; background: linear-gradient(145deg, #e1f0ff, #f0f8ff); border-radius: 8px; font-weight: bold; font-size: 16px; color: #0066cc; text-decoration: none; margin: 6px 0; box-shadow: 0 3px 6px rgba(0,0,0,0.08); transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); border: 1px solid #cce4ff; text-align: center; min-width: 60px; } .mobile-score-link:hover, .mobile-score-link:active { background: linear-gradient(145deg, #d0e5ff, #e1f0ff); transform: translateY(-3px); box-shadow: 0 6px 12px rgba(0,102,204,0.15); color: #004d99; } .mobile-score-link:active { transform: translateY(-1px); box-shadow: 0 2px 4px rgba(0,102,204,0.15); } `); } else { // 电脑端美化样式 GM_addStyle(` .info-container { display: flex; align-items: center; gap: 8px; margin-top: 4px; } .info-marker { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; padding: 2px 6px; border-radius: 4px; transition: all 0.2s ease; font-size: 0.9em; font-weight: bold; } .info-marker.has-info { background-color: rgba(40, 167, 69, 0.1); color: #28a745; } .info-marker.no-info { background-color: rgba(220, 53, 69, 0.1); color: #dc3545; } .info-marker:hover { transform: translateY(-1px); box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .info-marker.has-info:hover { background-color: rgba(40, 167, 69, 0.2); } .info-marker.no-info:hover { background-color: rgba(220, 53, 69, 0.2); } .info-loader { display: inline-flex; align-items: center; gap: 4px; color: #6c757d; font-size: 0.9em; margin-top: 4px; } .info-score { font-weight: bold; color: #007bff; cursor: pointer; padding: 2px 6px; border-radius: 4px; transition: all 0.2s ease; } .info-score:hover { background-color: rgba(0, 123, 255, 0.1); transform: translateY(-1px); } `); } // 提取URL的正则表达式 function extractUrl(jsCode) { if (!jsCode) return null; try { if (jsCode.startsWith('http')) return jsCode; var matches = jsCode.match(/openWindow\('([^']+)/); return matches && matches[1] ? matches[1] : null; } catch (error) { console.warn('URL提取错误:', error); return null; } } // 创建可点击标记(电脑端) function createComputerMarker(cell, hasInfo, url) { // 移除旧标记 var oldMarkers = cell.querySelectorAll('.info-container'); for (var i = 0; i < oldMarkers.length; i++) { var oldMarker = oldMarkers[i]; if (oldMarker.parentNode === cell) { cell.removeChild(oldMarker); } } // 创建容器 var container = document.createElement('div'); container.className = 'info-container'; // 创建成绩显示 var scoreDisplay = document.createElement('div'); scoreDisplay.className = 'info-score'; // 获取原始分数 var originalScore = cell.querySelector('a font[color="blue"]'); var scoreValue = originalScore ? originalScore.textContent : '?'; scoreDisplay.textContent = scoreValue; scoreDisplay.addEventListener('click', function(e) { e.stopPropagation(); if (url) openDetailsPage(url); }); // 创建标记 var infoMarker = document.createElement('div'); infoMarker.className = 'info-marker ' + (hasInfo ? 'has-info' : 'no-info'); // 创建图标 var icon = document.createElement('span'); icon.textContent = hasInfo ? '✓' : '✕'; // 创建文本 var text = document.createElement('span'); text.textContent = hasInfo ? '有详情' : '无详情'; // 添加点击事件 if (url) { infoMarker.addEventListener('click', function(e) { e.stopPropagation(); openDetailsPage(url); }); } // 组装元素 infoMarker.appendChild(icon); infoMarker.appendChild(text); container.appendChild(scoreDisplay); container.appendChild(infoMarker); cell.appendChild(container); // 移除原始链接 var originalLink = cell.querySelector('a'); if (originalLink) { originalLink.style.display = 'none'; } return container; } // 创建移动端链接 function createMobileLink(cell, url) { // 移除旧标记 var oldLinks = cell.querySelectorAll('a.mobile-score-link'); for (var i = 0; i < oldLinks.length; i++) { var oldLink = oldLinks[i]; if (oldLink.parentNode === cell) { cell.removeChild(oldLink); } } // 获取原始分数 var originalScore = cell.querySelector('a font[color="blue"]'); var scoreValue = originalScore ? originalScore.textContent : '?'; // 创建新链接 var newLink = document.createElement('a'); newLink.className = 'mobile-score-link'; newLink.textContent = scoreValue; newLink.href = 'javascript:void(0)'; if (url) { newLink.addEventListener('click', function(e) { e.preventDefault(); openDetailsPage(url); }); } cell.appendChild(newLink); // 移除原始链接 var originalLink = cell.querySelector('a'); if (originalLink) { originalLink.style.display = 'none'; } return newLink; } // 打开详情页 function openDetailsPage(url) { if (typeof unsafeWindow.openWindow === 'function') { unsafeWindow.openWindow(url, isMobile ? '100%' : 700, isMobile ? '100%' : 500); } else { window.open(url, '_blank', isMobile ? '' : 'width=700,height=500'); } } // 主处理函数 function processPage() { try { // 1. 恢复注释中的成绩链接 var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_COMMENT, null, false); var toRemove = []; var node; while ((node = walker.nextNode())) { try { var content = node.nodeValue.trim(); if (content.startsWith('