// ==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("✅ 程序已就绪!");
}
})();