// ==UserScript== // @name 菁优组卷与试卷打印处理程序 // @version 1.0 // @namespace https://codezhangborui.github.io // @description 【2024/10/22 更新版】自动处理菁优个人组卷与试卷界面,使其能够直接打印 // @author CodeZhangBorui // @match http://www.jyeoo.com/*/paper/detail/* // @match https://www.jyeoo.com/*/paper/detail/* // @match http://www.jyeoo.com/*/report/detail/* // @match https://www.jyeoo.com/*/report/detail/* // @icon https://www.jyeoo.com/favicon.ico // @grant GM_registerMenuCommand // @grant GM_notification // @homepage https://github.io/CodeZhangBorui/Jyeoo-Print-Processer // @license MIT // ==/UserScript== (function() { 'use strict'; var username = document.querySelector("div.profile-name")?.children[0]?.children[0]?.innerHTML || '用户'; console.log("%c菁优组卷打印处理程序 %cBy CodeZhangBorui Version 0.19\n%c菁优网用户 %s,欢迎您使用本脚本", 'font-size: large; font-family: "微软雅黑"', 'font-size: large; font-family: "Consolas"', 'font-size: large; font-family: "微软雅黑"', username); GM_registerMenuCommand("处理后自动刷新", () => { if (localStorage.getItem("EnableAutoRefresh") == 'N'){ localStorage.setItem("EnableAutoRefresh", 'Y'); GM_notification("处理后自动刷新:已开启"); } else { localStorage.setItem("EnableAutoRefresh", 'N'); GM_notification("处理后自动刷新:已关闭"); } }) if(localStorage.getItem("EnableAutoRefresh") == null) { localStorage.setItem("EnableAutoRefresh", 'Y'); function FirstUseSettingsStep1() { showConfirm('请完成脚本设置:是否要在完成处理后自动刷新?
默认值:是。注意:Safari 请填写 N', ['是', function(){ localStorage.setItem("EnableAutoRefresh", 'Y'); showMessage('设置成功!'); showProcess('脚本设置就绪,请点击右侧"立即处理并打印"按钮执行。'); closeBox(this); }], ['否', function(){ localStorage.setItem("EnableAutoRefresh", 'N'); showMessage('设置成功!'); showProcess('脚本设置就绪,请点击右侧"立即处理并打印"按钮执行。'); closeBox(this); }], 0); } FirstUseSettingsStep1(); } console.log("🔹 创建按钮对象..."); var tipP = document.createElement('p'); tipP.innerText = "----- 菁优组卷与试卷打印处理程序 -----"; var processButton = document.createElement('span'); processButton.innerHTML = `立即处理并打印`; processButton.onclick = function() { var EnableAutoRefresh = localStorage.getItem("EnableAutoRefresh")=='Y'?true:false; // 获取当前URL,判断是否是首页(试卷详情页) var isPaperDetail = window.location.href.indexOf('/paper/detail/') !== -1; var isReportDetail = window.location.href.indexOf('/report/detail/') !== -1; var isFirstPage = isPaperDetail || isReportDetail; function deleteElementByClassName(ClassName) { var elements = document.getElementsByClassName(ClassName); while(elements.length > 0) { elements[0].remove(); } } function deleteElementById(Id) { var obj = document.getElementById(Id); if(obj) { obj.remove(); } } function removeBorderByClassName(ClassName) { var obj = document.getElementsByClassName(ClassName); for(var i = 0; i < obj.length; i++) { obj[i].setAttribute('style', 'border: none !important;'); } } //获取提示用信息 var papertitle = document.getElementsByClassName('paper-title')[0]?.innerText || '未知试卷'; var subject = document.getElementsByClassName('nav-subject')[0]?.innerText || '未知科目'; // ============ 延迟执行,确保动态元素已生成 ============ setTimeout(function() { // ===== 1. 处理浮动框 ===== // 移除 qrcode-side(分享二维码) var qrcodeElements = document.querySelectorAll('.qrcode-side, [class*="qrcode-side"]'); qrcodeElements.forEach(function(el) { el.remove(); }); // 移除 return-top(返回顶部) var returnTopElements = document.querySelectorAll('.return-top, a.return-top, [class*="return-top"]'); returnTopElements.forEach(function(el) { el.remove(); }); // 移除 divRight(试卷篮) deleteElementById('divRight'); deleteElementByClassName('divReportCart'); // 移除 divQues(试题篮) deleteElementById('divQues'); // 移除固定底部导航 deleteElementByClassName('new-fixed-bottom'); deleteElementByClassName('fixed-bottom'); // 移除顶部导航 deleteElementByClassName('top'); deleteElementById('borwserWarning'); deleteElementByClassName('brower-tip'); deleteElementByClassName('header'); deleteElementById('divNav'); // 移除其他浮动元素 deleteElementByClassName('clear'); deleteElementByClassName('foot'); deleteElementByClassName('paper-tab-ctrl'); deleteElementByClassName('paper-side-2024'); deleteElementById('divBread'); deleteElementByClassName('fieldtip'); // 移除右侧内容推荐区域 var rightSidebars = document.querySelectorAll('.new-content-right, .fright[style*="width:270px"]'); rightSidebars.forEach(function(el) { el.remove(); }); // 移除所有固定/粘性定位的浮动元素 var allElements = document.querySelectorAll('*'); var elementsToRemove = []; for (var i = 0; i < allElements.length; i++) { var elem = allElements[i]; var style = window.getComputedStyle(elem); var position = style.position; if (position === 'fixed' || position === 'sticky') { var rect = elem.getBoundingClientRect(); var isRightSide = rect.left > window.innerWidth * 0.4; var isBottomSide = rect.top > window.innerHeight * 0.6; var className = (elem.className || '').toLowerCase(); var id = (elem.id || '').toLowerCase(); var keywords = ['share', 'float', 'fixed', 'toolbar', 'side', 'right', 'bottom', 'cart', 'basket', 'qrcode', '二维码', '分享', '浮动', '工具', '试题篮', '试卷篮', 'return', '返回', 'top']; var shouldRemove = false; for (var j = 0; j < keywords.length; j++) { if (className.indexOf(keywords[j]) !== -1 || id.indexOf(keywords[j]) !== -1) { shouldRemove = true; break; } } if ((isRightSide || isBottomSide) && shouldRemove) { var isMainContent = elem.closest('.content') || elem.closest('.paper-content') || elem.closest('.main-content') || elem.closest('.ques-list'); if (!isMainContent) { elementsToRemove.push(elem); } } } } for (var k = 0; k < elementsToRemove.length; k++) { elementsToRemove[k].remove(); } // 移除遮罩层 deleteElementByClassName('box-overlay'); deleteElementByClassName('bg-mask'); deleteElementByClassName('guide-overlay'); // ===== 2. 处理标题 ===== // 如果是首页(试卷详情页),保留标题但不遮挡内容 if (isFirstPage) { var titleElem = document.querySelector('.paper-title'); if (titleElem) { // 将标题改为静态定位,不遮挡内容 titleElem.style.position = 'relative'; titleElem.style.top = 'auto'; titleElem.style.zIndex = 'auto'; titleElem.style.marginTop = '0'; titleElem.style.paddingTop = '10px'; // 确保标题在内容区域顶部 var contentArea = document.querySelector('.content') || document.querySelector('.paper-content'); if (contentArea && titleElem.parentNode) { // 如果标题不在内容区域,移动到内容区域顶部 if (!contentArea.contains(titleElem)) { contentArea.insertBefore(titleElem, contentArea.firstChild); } } } } else { // 非首页,完全移除标题 var titleElems = document.querySelectorAll('.paper-title, .title-wrap, .exam-title, .paper-header'); titleElems.forEach(function(el) { el.remove(); }); } // 移除所有固定定位的标题容器 var titleContainers = document.querySelectorAll('.paper-title, .title-wrap, .exam-title, .paper-header, .h2-txt'); titleContainers.forEach(function(elem) { var style = window.getComputedStyle(elem); if (style.position === 'fixed' || style.position === 'sticky' || style.position === 'absolute') { elem.remove(); } }); // ===== 3. 调整内容区域 ===== var paperContent = document.querySelector('.paper-content') || document.querySelector('.main-content') || document.querySelector('.content'); if (paperContent) { // 移除过大的内边距 var currentPaddingTop = parseInt(window.getComputedStyle(paperContent).paddingTop); if (currentPaddingTop > 30) { paperContent.style.paddingTop = '10px'; } paperContent.style.marginTop = '0'; paperContent.style.position = 'static'; } // 清理 body document.body.style.paddingBottom = '0px'; // ===== 4. 去除试题边框 ===== removeBorderByClassName('QUES_LI'); console.log("✅ 处理成功!已移除浮动框并处理标题"); GM_notification(subject + '| ' + papertitle, "✅ 试卷处理成功!"); window.print(); }, 800); // 延迟800ms,确保所有动态元素都已生成 if(EnableAutoRefresh) { window.location.reload(); } } var settingsButton = document.createElement('span'); settingsButton.innerHTML = `脚本设置`; settingsButton.onclick = function() { showConfirm('设置项1:是否要在完成处理后自动刷新?
默认值:是。注意:Safari 请填写 N', ['是', function(){ localStorage.setItem("EnableAutoRefresh", 'Y'); showMessage('设置成功!'); closeBox(this); }], ['否', function(){ localStorage.setItem("EnableAutoRefresh", 'N'); showMessage('设置成功!'); closeBox(this); }], 0); } console.log("🔹 查找将要添加的位置..."); var willAppendPlace = document.querySelector("div.mb15.bg-fff.pv15"); if(willAppendPlace == undefined) { console.error("❌ 无法找到将要添加的位置 Element:'div.mb15.bg-fff.pv15',程序现在将停止"); showMessage('❌ 出错了
脚本无法找到将要添加的位置 Element: div.mb15.bg-fff.pv15,程序现在将停止。请联系脚本作者更新!', false); } else { willAppendPlace.appendChild(tipP); willAppendPlace.appendChild(processButton); willAppendPlace.appendChild(settingsButton); console.log("✅ 程序已就绪!"); } })();