// ==UserScript== // @name 学习通富文本填空一键强注插件 // @namespace https://scriptcat.org/users/204800 // @version 1.0.1 // @description 完美兼容PC端油猴环境,自动在每个 UEditor 富文本框下生成按钮,一键突破学习通禁止粘贴限制,支持内存同步防空提交。 // @author Gstar // @match *://*.chaoxing.com/* // @grant none // @run-at document-end // @license MIT // ==/UserScript== (function() { 'use strict'; function initInjectCore() { // 抓取所有未被挂载按钮的超星富文本底座 Textarea const targets = document.querySelectorAll('textarea[id^="answerEditor"]:not([data-api-ready])'); targets.forEach((textarea) => { textarea.setAttribute('data-api-ready', 'true'); const editorId = textarea.id; // 创建原生风格的一键粘贴按钮 const btn = document.createElement('button'); btn.type = 'button'; btn.innerText = '📋 注入答案'; btn.style = "margin: 6px; padding: 4px 12px; background: #0084ff; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 12px; font-weight: 500; display: inline-block; box-shadow: 0 1px 3px rgba(0,0,0,0.1); transition: all 0.2s ease;"; // 按钮悬浮交互 btn.onmouseover = () => btn.style.background = '#0066cc'; btn.onmouseout = () => btn.style.background = '#0084ff'; // 注入核心逻辑 btn.addEventListener('click', async function(e) { e.preventDefault(); e.stopPropagation(); try { // 1. 直接从硬件层读取系统剪贴板文本 const text = await navigator.clipboard.readText(); if (!text) return; // 2. 检查全局作用域下的百度富文本实例 if (window.UE && window.UE.getEditor) { const ueInstance = window.UE.getEditor(editorId); if (ueInstance) { // 3. 走框架标准管道,用原生的
标签将文本平滑推入 DOM ueInstance.setContent(`
${text}
`); // 4. 强行分发变更事件,逼迫超星监听器同步内存,解除空提交隐患 ueInstance.fireEvent('contentChange'); // 成功反馈特效 btn.innerText = '✅ 注入成功'; btn.style.background = '#28a745'; setTimeout(() => { btn.innerText = '📋 注入答案'; btn.style.background = '#0084ff'; }, 1200); } } } catch (err) { // 隔离异常,不破坏页面原生 JS 线程 alert('注入被系统安全策略拦截,请先在页面任意空白处点击一下再试!'); } }); // 挂载到隐藏容器的兄弟节点或者父节点中,使其渲染在编辑框正下方 if (textarea.parentNode) { textarea.parentNode.appendChild(btn); } }); } // 巡检时钟:1 秒一次,对抗异步渲染和分页切换 setInterval(initInjectCore, 1000); })();