您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
学习通显示优化,重做已经做过的习题(本地功能,与学习通无关)等。目前在开发早期,功能还不完善,感谢您反馈问题。浏览器扩展管理请开启开发者模式才能正常使用油猴脚本!
// ==UserScript== // @name chaoxingRedo(学习通显示优化,浏览器本地重做习题) // @namespace https://xn--gmqq3isro3y3d.icu/ // @version 0.03 // @description 学习通显示优化,重做已经做过的习题(本地功能,与学习通无关)等。目前在开发早期,功能还不完善,感谢您反馈问题。浏览器扩展管理请开启开发者模式才能正常使用油猴脚本! // @author 听雨荷 // @match https://mooc1.chaoxing.com/* // @icon https://xn--gmqq3isro3y3d.icu/favicon.ico // @license MIT // ==/UserScript== (function() { var style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(`#setting { --light_color: #ffffff; --font_color: #181818; --bg_color: #f0f0f0; --color: rgb(5, 141, 255); } #setting.dark { --light_color: #ffffff; --font_color: #f0f0f0; --bg_color: #181818; --color: rgb(5, 43, 255); } #setting { position: fixed; top: 72px; left: 72px; width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; height: -webkit-fit-content; height: -moz-fit-content; height: fit-content; font: initial; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; z-index: 100000 } #setting_icon_div { position: absolute; top: 0; left: -48px; width: 48px; height: 48px; display: -webkit-box; display: -webkit-flex; display: -moz-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -webkit-align-items: center; -moz-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -webkit-justify-content: center; -moz-box-pack: center; -ms-flex-pack: center; justify-content: center; cursor: move } #setting_icon_div:before { -webkit-box-shadow: 0; box-shadow: 0; border-radius: 84.5px; background: #fff; position: absolute; margin-left: -36px; margin-top: -36px; opacity: .2; height: 72px; width: 72px; left: 50%; top: 50% } #setting_icon_div { background-color: var(--light_color); border-radius: 50%; -webkit-box-shadow: 0 10px 15px -4px rgb(122 165 159 / 65%), inset 0 -3px 4px -1px rgb(185 220 221 / 0), 0 -10px 15px -1px rgb(238 254 255 / 0), inset 0 3px 4px -1px rgb(114 145 152 / 27%), inset 0 0 5px 1px rgb(136 178 173 / 40%), inset 0 20px 30px 0 rgb(182 244 237 / 36%); box-shadow: 0 10px 15px -4px rgb(122 165 159 / 65%), inset 0 -3px 4px -1px rgb(185 220 221 / 0), 0 -10px 15px -1px rgb(238 254 255 / 0), inset 0 3px 4px -1px rgb(114 145 152 / 27%), inset 0 0 5px 1px rgb(136 178 173 / 40%), inset 0 20px 30px 0 rgb(182 244 237 / 36%) } #setting_icon_div:active { -webkit-filter: blur(0.5px); filter: blur(0.5px); -webkit-box-shadow: inset 0 -8px 30px 1px rgb(153 255 247 / 0), 0 -10px 15px -1px rgb(174 218 228 / 48%), inset 0 8px 25px 0 rgb(121 156 157 / 73%), inset 0 0 10px 1px rgb(14 53 57 / 49%); box-shadow: inset 0 -8px 30px 1px rgb(153 255 247 / 0), 0 -10px 15px -1px rgb(174 218 228 / 48%), inset 0 8px 25px 0 rgb(121 156 157 / 73%), inset 0 0 10px 1px rgb(14 53 57 / 49%) } #setting_div { position: absolute; top: 0; left: 0; width: 350px; padding: 15px; border-radius: 5%; background-color: var(--bg_color); -webkit-box-shadow: 1px 1px 9px 0 rgb(116 174 227 / 45%), -1px -1px 9px 0 rgb(157 214 245 / 40%); box-shadow: 1px 1px 9px 0 rgb(116 174 227 / 45%), -1px -1px 9px 0 rgb(157 214 245 / 40%); height: -webkit-fit-content; height: -moz-fit-content; height: fit-content; -webkit-transition: .3s ease-out; -o-transition: .3s ease-out; -moz-transition: .3s ease-out; transition: .3s ease-out; -webkit-transform-origin: 0 24px; -moz-transform-origin: 0 24px; -ms-transform-origin: 0 24px; -o-transform-origin: 0 24px; transform-origin: 0 24px; -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); -o-transform: scale(0); transform: scale(0) } .toggle_switches_div { position: relative; margin: 5px 0 0 20px } .switch { float: right; font-size: 17px; position: relative; display: block; width: 50px; height: 20px } .switch input { opacity: 0; width: 0; height: 0 } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background: #fff; -webkit-transition: .4s; -o-transition: .4s; -moz-transition: .4s; transition: .4s; border-radius: 30px; border: 1px solid #ccc } .slider:before { position: absolute; content: ""; height: 20px; width: 20px; border-radius: 16px; left: 1px; top: -1px; bottom: 0; background-color: white; -webkit-box-shadow: 0 2px 5px #999; box-shadow: 0 2px 5px #999; -webkit-transition: .4s; -o-transition: .4s; -moz-transition: .4s; transition: .4s } input:checked+.slider { background-color: #5fdd54; border: 1px solid transparent } input:checked+.slider:before { -webkit-transform: translateX(29px); -moz-transform: translateX(29px); -ms-transform: translateX(29px); -o-transform: translateX(29px); transform: translateX(29px) } #output { position: relative; margin: 1px 0 0 20px; display: flex; flex-direction: row; flex-wrap: wrap; } #wrap_num { margin-right: 30px; } #output>div:not(:nth-child(1)) { margin-right: 10px; } .output_button { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; font-size: 16px; font-weight: 400; height: 24px; width: 42px; border: 0px solid blue; padding: 0 5px; text-align: center; background-image: linear-gradient(45deg, blue, #00f0a0, blue); background-size: 500% 400%; color: white; border-radius: 50px; transition: 0.6s all; } .output_button:hover { background-position: 75% 50%; transform: perspective(100px) } .output_button:active { /* transform: scaleY(0.95); */ /* transform: scaleY(1.05); */ /* transform: translateX(20px); */ transition: 0.1s; } /* #about {} */ #about>div { position: relative; margin: 1px 0 0 20px; font-size: smaller; } #single_output, #single_download, #preview { /* background-color: #f0eded; */ /* border-radius: 5px; */ /* border: 1px solid black; */ /* padding: 0 3px; */ cursor: pointer; } /* 自定义方法的样式 */ /* ------------------------------------ */ /* 我的答案是否悬停显示 */ .colorDeep.marginRight40.fl { /* font-size: 18px; */ } .colorDeep.marginRight40.fl.hide { filter: blur(10px); } .colorDeep.marginRight40.fl.hide:hover { filter: blur(0px); } /* ------------------------------------ */ /* 正确答案是否悬停显示 */ .colorGreen.marginRight40.fl { font-size: 18px; } .colorGreen.marginRight40.fl.hide { filter: blur(10px); } .colorGreen.marginRight40.fl.hide:hover { filter: blur(0px); } .mark_table.padTop60.ans-cc.fontLabel { --optionRightDisplay: 1; --optionRightDisplay_: none; } .option_right::before { position: absolute; /* top: 14px; */ left: 10px; content: "√"; line-height: 30px; font-weight: 500; font-size: 30px; color: #00B86E; opacity: var(--optionRightDisplay); display: var(--optionRightDisplay_); } .marBom60.questionLi.singleQuesId:has(.colorGreen.marginRight40.fl.hide:hover) .option_right::before { display: var(--optionRightDisplay_); } .marBom60.questionLi.singleQuesId:has(.colorGreen.marginRight40.fl.hide) .option_right::before { display: none; } .marBom60.questionLi.singleQuesId:has(.colorGreen.marginRight40.fl) .option_right::before { display: var(--optionRightDisplay_); } `)); document.head.appendChild(style); var divElement = document.createElement("div"); divElement.innerHTML = `<div id="setting"> <div id="setting_icon_div" draggable="true"> <svg t="1705244734270" id="setting_icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3193" width="32" height="32"> <path d="M482.88 112l-17.28 90.688-20.64 4.512a309.696 309.696 0 0 0-99.776 41.088l-18.688 11.84-73.28-55.04-44.64 44.64 51.904 76.416-11.392 17.76a310.016 310.016 0 0 0-41.568 99.584l-4.8 21.6-90.72 12.896v63.104l90.688 17.312 4.512 20.64a309.984 309.984 0 0 0 41.088 99.776l11.84 18.688-55.04 73.28 44.64 44.64 76.416-51.904 17.76 11.392a310.016 310.016 0 0 0 99.584 41.568l21.6 4.8 12.896 90.72h63.104l17.312-90.688 20.64-4.512a309.984 309.984 0 0 0 99.776-41.088l18.688-11.84 73.28 55.04 44.64-44.64-51.904-76.416 11.392-17.76a310.016 310.016 0 0 0 41.568-99.584l4.8-21.6 90.72-12.896V482.88l-90.688-17.312-4.512-20.64a309.984 309.984 0 0 0-41.088-99.776l-11.84-18.688 55.04-73.28-44.64-44.64-76.416 51.904-17.76-11.392a310.144 310.144 0 0 0-99.584-41.568l-21.6-4.8-12.896-90.72H482.88zM410.56 149.856l19.424-101.856h171.584l14.624 102.624c28 8.064 54.848 19.328 80.128 33.568l85.792-58.304 121.344 121.344-62.272 82.88c14.08 25.408 25.152 52.352 32.96 80.416l101.888 19.424v171.584l-102.624 14.624a373.92 373.92 0 0 1-33.568 80.128l58.304 85.792-121.344 121.344-82.88-62.272c-25.408 14.08-52.352 25.152-80.416 32.96l-19.424 101.888h-171.584l-14.624-102.624a373.92 373.92 0 0 1-80.128-33.568L241.92 898.112l-121.344-121.344 62.272-82.88a373.824 373.824 0 0 1-32.96-80.416L48 594.048v-171.584l102.624-14.624c8.064-27.968 19.328-54.848 33.568-80.128L125.888 241.92l121.344-121.344 82.88 62.272a373.856 373.856 0 0 1 80.416-32.96z" fill="#000000" p-id="3194"></path> <path d="M512 704a192 192 0 1 1 0-384 192 192 0 0 1 0 384z m0-64a128 128 0 1 0 0-256 128 128 0 0 0 0 256z" fill="#000000" p-id="3195"></path> </svg> </div> <div id="setting_div" data-setting-show="0" style="transform: scale(0);"> <div class="setting_item"> <div class="setting_item_title">1.常规显示</div> <!-- <div class="toggle_switches_div"> 正确选项前显示“√” <label class="switch"> <input type="checkbox" id="option_before" placeholder="功能" data-is-option-right-display="0"></input> <span class="slider"></span> </label> </div> --> <div class="toggle_switches_div"> 鼠标悬停显示我的答案 <label class="switch"> <input type="checkbox" id="is_hide_answer_my" placeholder="功能" data-is-hide-answer-my="show"></input> <span class="slider"></span> </label> </div> <div class="toggle_switches_div"> 鼠标悬停显示正确答案 <label class="switch"> <input type="checkbox" id="is_hide_answer_true" placeholder="功能" data-is-hide-answer-true="show"></input> <span class="slider"></span> </label> </div> <div class="toggle_switches_div"> 全屏模式 <label class="switch"> <input type="checkbox" id="is_immerse_setting" placeholder="功能" data-is-immerse-setting="0"></input> <span class="slider"></span> </label> </div> </div> <div class="setting_item"> <div class="setting_item_title">2.题目功能</div> <div id="output"> <div id="wrap_num" style="color:red">题目识别失败</div> <div id="single_output" class="output_button">复制</div> <div id="single_download" class="output_button">下载</div> <div id="preview" class="output_button">重做</div> </div> </div> <div class="setting_item"> <div class="setting_item_title">3.说明&问题反馈</div> <div id="about"> <hr> <div>本脚本与学习通无关,重做题目在本地进行,只有部分作业题目有效,对考试题目无效;学习通异常请关闭脚本。</div> <hr> <div><a href="https://xn--gmqq3isro3y3d.icu/" target="_blank">官网</a> <a href="https://xn--gmqq3isro3y3d.icu/%E4%B9%A0%E9%A2%98/%E5%AD%A6%E4%B9%A0%E9%80%9A2json/How%20to%20use.html" target="_blank">使用教程(24/11/25 | v0.03)</a> <a href="https://greasyfork.org/zh-CN/scripts/518327-chaoxingredo-%E5%AD%A6%E4%B9%A0%E9%80%9A%E6%98%BE%E7%A4%BA%E4%BC%98%E5%8C%96-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%9C%AC%E5%9C%B0%E9%87%8D%E5%81%9A%E4%B9%A0%E9%A2%98" target="_blank">检查更新</a></div> <div>问题反馈:<span style="user-select: all;">[email protected]</span></div> <hr> <div>关于此脚本:作业题目已经提交后才能使用脚本:①如果有“正确答案”,脚本匹配“正确答案”为脚本的正确答案 ②没有则匹配“我的答案”</div> <hr> </div> </div> </div> </div>`; document.body.appendChild(divElement); { g_open_url = "https://xn--gmqq3isro3y3d.icu/%E4%B9%A0%E9%A2%98/exercise.html?extension" class Json_template { constructor(questions, options_arr, type = [], type_code = null, answers = [], answers_matching_index = [], analysis = []) { this.questions = questions; this.options = options_arr; this.type = type; this.type_code = type_code; this.answers = answers; this.answers_matching_index = answers_matching_index; this.analysis = analysis; } } class type_code_2_type { constructor(type_code) { this.type_code = type_code this.type = ["单选题", "多选题", "判断题", "填空题", "简答题", "自定义"][type_code + 1] } // let code_arr = ["单选题", "多选题", "判断题", "填空题", "简答题", "自定义"] } let a = { "questions": [ "流行性脑脊髓膜炎的病变性质属于: ( )" ], "type": [ "单选题" ], "type_code": "1", "options": [ "变质性炎", "渗出性炎", "增生性炎", "肉芽肿性炎", "化脓性炎" ], "answers": [ "E" ], "analysis": [], "answers_matching_rate": [ "100%" ], "answers_matching_index": [ 4 ] } function get_type(wrap) { let type_arr = ["单选题", "多选题", "判断题", "填空题", "简答题", "其它"]; let type = ""; let type_code = -1; // 初始化类型代码,-1表示未找到匹配类型 if (wrap.innerText) { // 遍历type_arr数组,检查wrap.innerText是否包含对应类型的标识 for (let i = 0; i < type_arr.length; i++) { if (wrap.innerText.includes(type_arr[i])) { type = type_arr[i]; type_code = i + 1; // 假设类型代码为在数组中的索引 break; // 找到匹配的类型后退出循环 } } } // 如果找到类型,则返回类型和类型代码,否则返回null或其他表示未找到的值 if (type_code !== -1) { return [type, type_code]; } else { return null; // 或者返回[null, null]或其它表示未找到的方式 } } // TODO: 如果没有找到就报错 function main() { // 全局变量 let json = { "head": { "version": "1.1.0", "author": "听雨荷", "course": "学习通", "filename": "", "type_all_num": -1, "type_2_num": -1, "time": "", "id": "" }, "body": [ ] } let title = "" if (document.getElementsByClassName("mark_title")[0]) { title = document.getElementsByClassName("mark_title")[0].innerText } json["head"]["filename"] = title let divQuestion = document.getElementsByClassName("mark_table padTop60 ans-cc fontLabel")[0] // console.log(divQuestion); let wraps = divQuestion.getElementsByClassName("mark_item") // 不同题型的包裹 for (let h = 0; h < wraps.length; h++) { let wraps_each = wraps[h] // 单个题目的包裹 let wrap = wraps_each.getElementsByClassName("marBom60 questionLi singleQuesId") for (let i = 0; i < wrap.length; i++) { let questions = [] let type = [] let type_code = "-1" let options_arr = [] let answers = [] let answers_matching_index = [] let wrap_each = wrap[i] // console.log("wrap_each", wrap_each); questions = wrap_each.getElementsByClassName("mark_name colorDeep")[0].innerText.replace(/\d+\. /gm, "").replace(/\(.*?题\)/, "") if (questions == null) { console.warn(wrap_each, "questions:null"); continue } [type, type_code] = get_type(wrap_each) if (type_code == "1" || type_code == "2") { let options_wrap = wrap_each.getElementsByClassName("mark_letter colorDeep")[0].getElementsByTagName("li") // console.log(questions, wrap_each.getElementsByClassName("mark_letter colorDeep")[0].getElementsByTagName("li"), options_wrap); for (let j = 0; j < options_wrap.length; j++) { let option = options_wrap[j].innerText.replace(/[A-Z]/, "").replace(/./, "").replace(/\n/, "") options_arr.push(option) } // console.log(wrap_each.getElementsByClassName("mark_key clearfix")); let answers_wrap = wrap_each.getElementsByClassName("mark_answer")[0] console.log(answers_wrap.getElementsByClassName("mark_key clearfix")[0], answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl")); if (answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl").length != 0) { answers = answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl")[0].innerText.replace("正确答案:", "") let answers_char_arr = answers.match(/[A-Z]/gm) for (let h = 0; h < answers_char_arr.length; h++) { let answers_char = answers_char_arr[h] answers_matching_index.push(answers_char.charCodeAt(0) - 65) } console.log("answers", answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl"), answers, answers_char_arr, answers_matching_index); } else { console.warn(wrap_each, answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl"), "没有获取到正确答案,尝试匹配我的答案"); if (answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl").length != 0) { answers = answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl")[0].innerText.replace("正确答案:", "") let answers_char_arr = answers.match(/[A-Z]/gm) for (let h = 0; h < answers_char_arr.length; h++) { let answers_char = answers_char_arr[h] answers_matching_index.push(answers_char.charCodeAt(0) - 65) } console.log("answers", answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl"), answers, answers_char_arr, answers_matching_index); } else { console.warn(wrap_each, answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl"), "没有获取到我的答案"); } } } else if (type_code == "3") { options_arr = [ "错误", "正确" ] let answers_wrap = wrap_each.getElementsByClassName("mark_answer")[0] if (answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl").length != 0) { answers = answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl")[0].innerText.replace("正确答案", "") if (answers.match(/[(对)|(正确)]/)) { answers_matching_index[0] = 1 } else { answers_matching_index[0] = 0 } console.log("answers", answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl"), answers, answers_matching_index); } else { console.warn(wrap_each, answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorGreen marginRight40 fl"), "没有获取到正确答案"); if (answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl").length != 0) { answers = answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl")[0].innerText.replace("正确答案:", "") if (answers.match(/[(对)|(正确)]/)) { answers_matching_index[0] = 1 } else { answers_matching_index[0] = 0 } // console.log("answers", answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl"), answers, answers_char_arr, answers_matching_index); } else { console.warn(wrap_each, answers_wrap.getElementsByClassName("mark_key clearfix")[0].getElementsByClassName("colorDeep marginRight40 fl"), "没有获取到我的答案"); } } // continue } else if (type_code == "4" || type_code == "5") { let answers_wrap = wrap_each.getElementsByClassName("mark_answer")[0] if (answers_wrap.getElementsByClassName("mark_fill colorGreen")[0].getElementsByTagName("dd").length != 0) { answers_arr = answers_wrap.getElementsByClassName("mark_fill colorGreen")[0].getElementsByTagName("dd") for (let q = 0; q < answers_arr.length; q++) { answers.push(answers_arr[q].innerText.replace(/\n/gm, "").replace(/\(\d+\)/gm, "")) } console.log("answers", answers_wrap.getElementsByClassName("mark_fill colorGreen")[0].getElementsByTagName("dd"), answers); } else { console.warn(wrap_each, answers_wrap.getElementsByClassName("mark_fill colorGreen")[0].getElementsByTagName("dd"), "没有获取到正确答案"); } } let json_each = new Json_template(questions, options_arr, type, type_code, answers, answers_matching_index) // console.log(json_each); json["body"].push(json_each) } } document.getElementById("wrap_num").innerText = "共" + json["body"].length + "个题目" document.getElementById("wrap_num").style.color="green" // console.log(wrap); let json_str = JSON.stringify(json) console.log(json_str); return json_str // alert(json) } let single_output = document.getElementById("single_output") single_output.addEventListener("click", single_output_fun) function single_output_fun() { try { let json_str=main() navigator.clipboard.writeText(json_str) } catch (error) { alert("油猴脚本chaoxingRedo的通知:脚本调用主函数(作业题目重做功能)出错,反馈后关闭脚本,其它功能不知道能不能用!") return } alert("成功!") } let single_download = document.getElementById("single_download") single_download.addEventListener("click", single_download_fun) function single_download_fun() { try { var json = main() } catch (error) { alert("油猴脚本chaoxingRedo的通知:脚本调用主函数(作业题目重做功能)出错,反馈后关闭脚本,其它功能不知道能不能用!") return } let title = document.querySelector(".borderBom.padBom20.detailsHead h2.mark_title").innerText handleDownload(json, title) } function handleDownload(content, name = "测试数据") { let download = document.createElement("a") download.style.display = 'block' download.download = name + '.json'; var blob = new Blob([content], { type: "text/json" }); download.href = URL.createObjectURL(blob); download.click() } let preview = document.getElementById("preview") preview.addEventListener("click", preview_fun) function preview_fun() { try { var data = main() } catch (error) { alert("油猴脚本chaoxingRedo的通知:脚本调用主函数(作业题目重做功能)出错,反馈后关闭脚本,其它功能不知道能不能用!") console.error(error) return } let new_window_preview = window.open(g_open_url) console.log(data); var intetval = setInterval(() => { new_window_preview.postMessage(data, "*"), console.log("发送消息"); }, 300) window.addEventListener("message", (event) => { if (event.data == "1Med is OK!") { clearInterval(intetval) } }) } try { main() } catch (error) { console.error("主函数错误:",error) // alert("油猴脚本chaoxingRedo的通知:脚本调用主函数(作业题目重做功能)出错,反馈后关闭脚本,其它功能不知道能不能用!") } console.log("chaoxingRedo启动成功"); }; { // -------------------------------------------------------- let setting_icon_div = document.getElementById("setting_icon_div") // 隐藏与样式逻辑 setting_icon_div.addEventListener("click", function () { let setting_div = document.getElementById("setting_div") // console.log(setting_div, typeof setting_div, setting_div.dataset); let setting_show = setting_div.dataset.settingShow let setting_div_style = setting_div.style if (setting_show == "0") { setting_div.dataset.settingShow = "1" // setting_div_style.transform = "scaleY(1)" setting_div_style.transform = "scale(1)" } else if (setting_show == "1") { setting_div.dataset.settingShow = "0" // setting_div_style.transform = "scaleY(0)" setting_div_style.transform = "scale(0)" } }) // pc和手机设置球拖动逻辑 let offsetX, offsetY; // 将 offsetX 和 offsetY 移到共同的作用域 function drag_fun(e) { let bar_height = 36; let setting_icon_div_width = 48; // 与边框的距离 let distanse = 10 let setting = document.getElementById("setting") let setting_icon_div = document.getElementById("setting_icon_div") let setting_div = document.getElementById("setting_div") let setting_show = setting_div.dataset.settingShow if (setting_show == "0") { var _h = window.innerHeight - (setting_icon_div.offsetHeight + distanse) var _w = window.innerWidth - (setting_icon_div.offsetWidth + distanse) } else if (setting_show == "1") { var _h = window.innerHeight - (setting_div.offsetHeight + distanse) var _w = window.innerWidth - (setting_div.offsetWidth + setting_icon_div_width + distanse) } let div_top = e.clientY - offsetY let div_left = e.clientX - offsetX div_top = Math.min(Math.max(bar_height + distanse, div_top), _h) div_left = Math.min(Math.max(distanse, div_left), _w) setting.style.top = div_top + "px" setting.style.left = div_left + setting_icon_div_width + "px" } // PC拖拽逻辑 setting_icon_div.addEventListener("dragstart", function (e) { offsetX = e.offsetX; // 将 offsetX 和 offsetY 赋值在共同的作用域内 offsetY = e.offsetY; document.addEventListener("dragover", drag_fun) }) setting_icon_div.addEventListener("dragend", function (e) { document.removeEventListener("dragover", drag_fun) }) // 手机触摸拖动逻辑 let isDragging = false; setting_icon_div.addEventListener("touchstart", function (e) { isDragging = true; let touch = e.touches[0]; offsetX = touch.clientX - setting_icon_div.getBoundingClientRect().left; offsetY = touch.clientY - setting_icon_div.getBoundingClientRect().top; }, { passive: false }); document.addEventListener("touchmove", function (e) { if (isDragging) { e.preventDefault(); let touch = e.touches[0]; let setting = document.getElementById("setting"); let bar_height = 4; let distanse = 4; let setting_icon_div_width = 48; let setting_div = document.getElementById("setting_div"); let setting_show = setting_div.dataset.settingShow; let _h, _w; if (setting_show == "0") { _h = window.innerHeight - (setting_icon_div.offsetHeight + distanse); _w = window.innerWidth - (setting_icon_div.offsetWidth + distanse); } else if (setting_show == "1") { _h = window.innerHeight - (setting_div.offsetHeight + distanse); _w = window.innerWidth - (setting_div.offsetWidth + setting_icon_div_width + distanse); } let div_top = touch.clientY - offsetY; let div_left = touch.clientX - offsetX; div_top = Math.min(Math.max(bar_height + distanse, div_top), _h); div_left = Math.min(Math.max(distanse, div_left), _w); setting.style.top = div_top + "px"; setting.style.left = div_left + setting_icon_div_width + "px"; } }, { passive: false }); document.addEventListener("touchend", function () { isDragging = false; }) // ------------------------------------------- // 我的答案是否悬停显示 let answer_my_arr = document.querySelectorAll(".colorDeep.marginRight40.fl") // console.log(answer_my_arr); if (answer_my_arr.length != 0) { for (let i = 0; i < answer_my_arr.length; i++) { // answer_my_arr[i].style.transform = 'scale(1)'; answer_my_arr[i].classList.add("answer_my_show") } } let is_hide_answer_my = document.getElementById("is_hide_answer_my") is_hide_answer_my.addEventListener("click", is_hide_answer_my_fun) function is_hide_answer_my_fun() { let is_hide_answer_my = document.getElementById("is_hide_answer_my").dataset.isHideAnswerMy // console.log(is_hide_answer_my); if (is_hide_answer_my == "show") { document.getElementById("is_hide_answer_my").dataset.isHideAnswerMy = "hide" let answer_my_arr = document.querySelectorAll(".colorDeep.marginRight40.fl") for (let i = 0; i < answer_my_arr.length; i++) { answer_my_arr[i].classList.remove("show") answer_my_arr[i].classList.add("hide") } } else if (is_hide_answer_my == "hide") { document.getElementById("is_hide_answer_my").dataset.isHideAnswerMy = "show" let answer_my_arr = document.querySelectorAll(".colorDeep.marginRight40.fl") for (let i = 0; i < answer_my_arr.length; i++) { answer_my_arr[i].classList.remove("hide") answer_my_arr[i].classList.add("show") } } } // --------------------------------------------- // 正确答案是否悬停显示 let answer_arr = document.getElementsByClassName("colorGreen marginRight40 fl"); if (answer_arr.length != 0) { for (let i = 0; i < answer_arr.length; i++) { answer_arr[i].style.transform = 'scale(1)'; answer_arr[i].classList.add("show") } } let is_hide_answer_true = document.getElementById("is_hide_answer_true") is_hide_answer_true.addEventListener("click", is_hide_answer_true_fun) function is_hide_answer_true_fun() { let _is_show = document.getElementById("is_hide_answer_true").dataset.isHideAnswerTrue if (_is_show == "show") { document.getElementById("is_hide_answer_true").dataset.isHideAnswerTrue = "hide" let answer_show = document.getElementById("answer_show") let answer_arr = document.getElementsByClassName("colorGreen marginRight40 fl"); for (let i = 0; i < answer_arr.length; i++) { answer_arr[i].classList.remove("show") answer_arr[i].classList.add("hide") } } else if (_is_show == "hide") { document.getElementById("is_hide_answer_true").dataset.isHideAnswerTrue = "show" let answer_show = document.getElementById("answer_show") let answer_arr = document.getElementsByClassName("colorGreen marginRight40 fl"); for (let i = 0; i < answer_arr.length; i++) { answer_arr[i].classList.remove("hide") answer_arr[i].classList.add("show") } } } // --------------------------------- // 全屏function var elem = document.documentElement; /* 全屏查看 */ function openFullscreen() { if (elem.requestFullscreen) { elem.requestFullscreen(); } else if (elem.mozRequestFullScreen) { /* Firefox */ elem.mozRequestFullScreen(); } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari 和 Opera */ elem.webkitRequestFullscreen(); } else if (elem.msRequestFullscreen) { /* IE/Edge */ elem.msRequestFullscreen(); } } /* 关闭全屏 */ function closeFullscreen() { if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.mozCancelFullScreen) { /* Firefox */ document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { /* Chrome, Safari 和 Opera */ document.webkitExitFullscreen(); } else if (document.msExitFullscreen) { /* IE/Edge */ document.msExitFullscreen(); } } // 全屏模式 function immerse_setting_fun() { let immerse_setting_input = document.getElementById("is_immerse_setting") let is_immerse_setting = immerse_setting_input.dataset.isImmerseSetting if (is_immerse_setting == "0") { openFullscreen(elem) } else if (is_immerse_setting == "1") { closeFullscreen(elem) } immerse_setting_input.dataset.isImmerseSetting = 1 - is_immerse_setting } let is_immerse_setting = document.getElementById("is_immerse_setting") is_immerse_setting.addEventListener("click", immerse_setting_fun) // --------------------------------- }; })();