// ==UserScript==
// @name DFX工作台助手
// @namespace https://aboucide.github.io/blog/note/software-use/DFX-GZT.html
// @version 1.4.4
// @description 用于高中工作台,自动发送作业。
// @author Tiger
// @license MIT
// @match https://we.xdf.cn/*
// @icon https://we.xdf.cn/static/img/icon-center-teacher-logo.2b63420.png
// @grant none
// ==/UserScript==
(function () {
'use strict';
// 定义CSS样式
const css = `
.floating-window {
position: fixed;
cursor: grab;
padding: 10px;
background-color: #4CAF50;
color: white;
border-radius: 50%;
text-align: center;
font-size: 24px;
z-index: 10000;
top: 0;
left: 0;
transition: transform 0.1s ease;
}
.floating-window:active {
cursor: grabbing;
}
`;
// 创建<style>标签并将CSS样式添加到<head>
{ const style = document.createElement('style');
style.type = 'text/css';
style.appendChild(document.createTextNode(css));
document.head.appendChild(style);
}
// 创建悬浮窗<div>元素
{ const floatingWindow = document.createElement('div');
floatingWindow.className = 'floating-window';
floatingWindow.textContent = '☀️';
floatingWindow.style.left = '0';
floatingWindow.style.top = '0';
document.body.appendChild(floatingWindow);
// 初始化变量
let isDragging = false;
let clickEnabled = true;
let mouseXOffset = 0;
let mouseYOffset = 0;
// 处理鼠标按下事件,开始拖动
floatingWindow.addEventListener('mousedown', (e) => {
e.preventDefault();
isDragging = true;
clickEnabled = false;
mouseXOffset = e.clientX - floatingWindow.getBoundingClientRect().left;
mouseYOffset = e.clientY - floatingWindow.getBoundingClientRect().top;
//document.body.style.cursor = 'grabbing';
});
// 处理鼠标移动事件,更新悬浮窗的位置
document.addEventListener('mousemove', (e) => {
if (isDragging && !clickEnabled) {
floatingWindow.style.left = (e.clientX - mouseXOffset) + 'px';
floatingWindow.style.top = (e.clientY - mouseYOffset) + 'px';
}
});
// 处理鼠标松开事件,结束拖动
document.addEventListener('mouseup', (e) => {
if (isDragging) {
isDragging = false;
setTimeout(() => {
clickEnabled = true;
//document.body.style.cursor = 'grab';
}, 100);
}
});
// 处理点击事件,当悬浮窗被点击时触发
floatingWindow.addEventListener('click', (e) => {
let result = prompt("请问您想布置几次作业", 5);
if(result !==null)
{
// 创建悬浮日志窗口
const logWindowContent = createLogWindow();
result = parseInt(result, 10); //将用户输入的值转为10进制数字。
setTimeout(() => { main(result); }, 1500);
logMessage("开始发布作业,共计【" + result + "】次作业");
}
else
{
alert('已取消运行');
}
});
}
//程序运行主程序,x是用户输入的运行次数
function main(x)
{
//logMessage("即将开始发布【"+ x + "】次作业");
//logMessage("当前时间:"+new Date().toLocaleTimeString());
DJsjk();//点击【试卷库】
logMessage("当前时间:"+new Date().toLocaleTimeString());
logMessage("延迟5秒后继续操作");
setTimeout(() =>
{
for (let i = 0; i < x ; i++)
{
setTimeout(() =>
{ let iii = i+1;
logMessage('***开始第【' + iii +'】 次,大约要耗时45秒***');
onepaper();
}, i*(50000*(1+(i+1)/(25+i)))); //设置每50秒运行一次布置作业
}
}, 1000);
}
//选年份、选试卷、选学生、发送试卷
function onepaper()
{
logMessage("【本次开始】时间:"+new Date().toLocaleTimeString());
setTimeout(() => {
//这里会等待10秒,再往下执行
jinsannian(); //随机选取近三年中的某一年
setTimeout(() => {
setTimeout(() => {
logMessage("开始随机保存当前页面中随机一份试卷");
SJpaper();
setTimeout(() => {
DJcksj();//点击查看试卷
setTimeout(() => {
clickPublishToMiniProgramButton();//点击【发布至小程序】
setTimeout(() => {
clickHomeworkCategory();//点击课后作业
setTimeout(() => {
DJsubmit(); //点击提交
setTimeout(() => {
clickEditSpan(); //点击编辑
setTimeout(() => {
clickLastPlaceholderSelect();//点击最后一个选择框
setTimeout(() => {
clickLastExclusiveItem("专属型");
setTimeout(() => {
clickLastPlaceholderSelect();
setTimeout(() => {
clickLastExclusiveItem("按学员发布");
setTimeout(() => {
clickLastSelectStudentButton();//点击选择学员
setTimeout(() => {
countAndClickCheckbox(); //勾选学员
setTimeout(() => {
countAndClickConfirmButton(); //点击确认学员
setTimeout(() => {
countAndClickReleaseButton(); //点击发布
setTimeout(() => {
setTimeout(() =>
{
pageback(); //返回【试题库】
setTimeout(() =>
{
logMessage("现在返回到【试卷库】");
logMessage("【结束】时间:"+new Date().toLocaleTimeString());
logMessage("*******完成一次作业布置*******");
}, 2500);
}, 2000);//等待2秒
}, 1000);//17、等待1秒后,返回试卷页
}, 1000);//16、等待1秒后,点击【发布】
}, 2000);//15、等待2秒后,点击【确认】学员
}, 4000);//14、等待4秒后,点击学员类型【未开课】、【开课中】
}, 1000);//13、等待1秒后,点击【选择学员】
}, 1000);//12、等待1秒后,点击【按学员发布】
}, 2000);//11、等待2秒后,点击最后一个【选择】,选择发布对象
}, 1000);//10、等待1秒后,点击最后一个【专属型】
}, 1000);//9、等待1秒后,点击最后一个【选择】,选择发布类型
}, 2000);//8、等待2秒后,点击【编辑】
}, 2000);//7、等待2秒后,点击【提交】
}, 3000);//6、等待3秒后,点击【课后作业】
}, 4000);//5、等待4秒后,点击【发布至小程序】
}, 3000);//4、等待3秒后,点击【查看试卷】
}, 1000);//3、等待1秒后随机点击一份【试卷保存】。
}, 3000);//2、随机点击【年份】的按钮后,等待3秒。
}, 5000);// 1、点击【试卷库之后】等待5秒后,等待页面加载完成,随机点击近三年的某一年
}
// 点击“试卷库”
function DJsjk() {
// 点击具有文本“试卷库”的<li>元素
const targetElement = Array.from(document.querySelectorAll('li.el-menu-item')).find(element => element.textContent.trim() === '试卷库');
if (targetElement)
{
// 1、点击【试卷库之后】,延迟10秒
targetElement.click();
logMessage("已点击【试卷库】");
}
else
{
console.error('未找到【试卷库】,你当前真的在【XDF高中工作台】的首页吗?');
alert('未找到【试卷库】,你当前真的在【XDF高中工作台】的首页吗?')
}
}
// 随机点击近三年年份按钮
function jinsannian() {
// 设置超时时间和轮询间隔
let timeout = 10000; // 10秒
let interval = 1000; // 每1秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 选择所有包含年份文本的<button>元素
const yearButtons = Array.from(document.querySelectorAll('button.el-button'))
.filter(button => /^\d{4}年$/.test(button.querySelector('span')?.textContent.trim()));
// 获取前6个匹配的元素
const topThreeYearButtons = yearButtons.slice(1, 7);
// 如果找到了元素
if (topThreeYearButtons.length > 0) {
//logMessage("开始随机点击【近6年】");
// 随机选择一个按钮
const randomIndex = Math.floor(Math.random() * topThreeYearButtons.length);
const randomButton = topThreeYearButtons[randomIndex];
// 触发点击事件
randomButton.click();
logMessage(`随机选择【${randomButton.querySelector('span').textContent.trim()}】年份`);
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,未找到【年份】按钮');
window.history.back();
clearInterval(intervalId);
}
}, interval);
}
// 随机选取一份试卷
function SJpaper() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 8秒
let interval = 1000; // 每500毫秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 选择所有包含文本“保存”的<span>元素
const saveButtons = Array.from(document.querySelectorAll('span.btn-right'))
.filter(span => span.textContent.trim() === '保存');
// 获取匹配的元素数量
const saveButtonCount = saveButtons.length;
// 如果找到了元素
if (saveButtonCount > 0) {
//logMessage(`找到 ${saveButtonCount} 个文本为【保存】的按钮`);
// 随机选择一个按钮
const randomIndex = Math.floor(Math.random() * saveButtonCount);
const randomSaveButton = saveButtons[randomIndex];
// 触发点击事件
randomSaveButton.click();
logMessage(`随机【保存】第 ${randomIndex + 1} 张试卷`);
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,未找到【保存】按钮');
clearInterval(intervalId);
}
}, interval);
}
//点击【查看试卷】
function DJcksj() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 5秒
let interval = 1000; // 每500毫秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 使用querySelectorAll来获取所有匹配的按钮元素
let buttons = document.querySelectorAll('button.btn-primary');
// 如果找到了元素
if (buttons.length > 0) {
//logMessage(`点击【查看试卷】`);
// 过滤出包含文本为“查看试卷”的按钮
let targetButtons = Array.from(buttons).filter(button => {
let span = button.querySelector('span');
return span && span.textContent.trim() === "查看试卷";
});
if (targetButtons.length > 0) {
//logMessage(`找到 ${targetButtons.length} 个文本为'查看试卷'的按钮`);
// 遍历所有符合条件的按钮并点击
targetButtons.forEach((button, index) => {
logMessage(`点击【查看试卷】`);
button.click();
});
}
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待超时,未找到元素');
clearInterval(intervalId);
}
}, interval);
}
//点击【打印预览/下载】
function DJprint() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 8秒
let interval = 1000; // 每1000毫秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 使用querySelectorAll来获取所有匹配的按钮元素
// 更新选择器以匹配提供的按钮类名
let buttons = document.querySelectorAll('button.el-button.el-button--default.el-button--mini');
// 如果找到了元素
if (buttons.length > 0) {
logMessage(`点击【打印预览/下载】`);
// 过滤出包含文本为“打印预览/下载”的按钮
let targetButtons = Array.from(buttons).filter(button => {
let span = button.querySelector('span');
return span && span.textContent.trim() === "打印预览/下载";
});
if (targetButtons.length > 0) {
//logMessage(`找到 ${targetButtons.length} 个文本为'打印预览/下载'的按钮`);
// 遍历所有符合条件的按钮并点击
targetButtons.forEach((button, index) => {
//logMessage(`点击第 ${index + 1} 个按钮`);
button.click();
});
}
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,未找到【打印预览/下载】按钮');
clearInterval(intervalId);
}
}, interval);
}
//点击【发布至小程序】
function clickPublishToMiniProgramButton() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 8秒
let interval = 1000; // 每1000毫秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 使用querySelectorAll来获取所有匹配的按钮元素
let buttons = document.querySelectorAll('button.el-button.el-button--default.el-button--mini');
// 过滤出包含文本为“发布至小程序”的按钮
let publishButton = Array.from(buttons).filter(button => {
let span = button.querySelector('span');
return span && span.textContent.trim() === "发布至小程序";
})[0]; // 取第一个匹配的按钮
// 如果找到了元素
if (publishButton) {
logMessage(`点击【发布至小程序】`);
// 点击找到的按钮
publishButton.click();
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,未找到【发布至小程序】按钮');
clearInterval(intervalId);
}
}, interval);
}
//点击【课后作业】
function clickHomeworkCategory() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 8秒
let interval = 1000; // 每1000毫秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 使用querySelectorAll来获取所有匹配的category-item元素
let categoryItems = document.querySelectorAll('.category-item');
// 过滤出包含文本为“课后作业”的category-item元素
let homeworkCategory = Array.from(categoryItems).filter(item => item.textContent.trim() === "课后作业")[0];
// 如果找到了元素
if (homeworkCategory) {
logMessage(`点击【课后作业】`);
// 点击找到的元素
homeworkCategory.click();
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,未找到【课后作业】');
clearInterval(intervalId);
}
}, interval);
}
// 点击【提交】
function DJsubmit() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 8秒
let interval = 1000; // 每1000毫秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 使用querySelectorAll来获取所有匹配的按钮元素
let buttons = document.querySelectorAll('.dialog-footer .el-button.el-button--primary');
// 过滤出包含文本为“提交”的按钮
let submitButtons = Array.from(buttons).filter(button => {
let span = button.querySelector('span');
return span && span.textContent.trim() === "提交";
});
// 如果找到至少一个按钮
if (submitButtons.length > 0) {
// 输出找到的按钮数量
//logMessage(`找到 ${submitButtons.length} 个文本为'提交'的按钮`);
// 点击第一个按钮
submitButtons[0].click();
logMessage(`点击【提交】`);
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,未找到"提交"的按钮');
clearInterval(intervalId);
}
}, interval);
}
// 点击【编辑】
function clickEditSpan() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 8秒
let interval = 1000; // 每1秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 使用querySelectorAll来获取所有匹配的span元素
let editSpans = document.querySelectorAll('span.edit');
// 过滤出包含文本为“编辑”的span
let targetEditSpans = Array.from(editSpans).filter(span => {
return span.textContent.trim() === "编辑";
});
// 如果找到至少一个span
if (targetEditSpans.length > 0) {
// 输出找到的span数量
//logMessage(`找到 ${targetEditSpans.length} 个文本为'编辑'的span`);
// 点击第一个span
targetEditSpans[0].click();
logMessage(`点击【编辑】`);
clearInterval(intervalId); // 清除循环
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,没有找到"编辑"');
clearInterval(intervalId);
}
}, interval);
}
// 点击最后一个【请选择】的下拉箭头
function clickLastPlaceholderSelect() {
// 设置超时时间和轮询间隔
let timeout = 8000; // 8秒
let interval = 1000; // 每1000毫秒检查一次
// 定义一个变量来记录开始时间
let startTime = Date.now();
// 使用setInterval来循环检查元素
let intervalId = setInterval(() => {
// 使用querySelectorAll来获取所有匹配的输入框元素
let inputs = document.querySelectorAll('input[placeholder="请选择"]');
// 统计找到的输入框数量
let count = inputs.length;
//logMessage(`总共找到 ${count} 个占位符为'请选择'的输入框`);
// 检查是否找到至少一个输入框
if (count > 0) {
// 获取最后一个输入框
let input = inputs[count - 1];
// 获取输入框旁边的下拉箭头元素
let suffix = input.parentElement.querySelector('.el-input__suffix-inner .el-icon-arrow-up');
if (suffix) {
// 模拟点击下拉箭头
suffix.click();
//logMessage(`开始设置类型`);
clearInterval(intervalId); // 清除循环
} else {
logMessage(`最后一个输入框没有找到下拉箭头`);
clearInterval(intervalId); // 清除循环
}
} else if (Date.now() - startTime > timeout) {
// 如果超过超时时间,停止循环
logMessage('等待8秒,超时,没有找到"请选择"');
clearInterval(intervalId);
}
}, interval);
}
//点击弹出的选择列表为xxx的选项
function clickLastExclusiveItem(xxx) {
// 使用querySelectorAll来获取所有匹配的li元素
let items = document.querySelectorAll('li.el-select-dropdown__item');
// 检查是否找到至少一个li元素
if (items.length > 0) {
// 从找到的li元素中筛选出包含文本“专属型”的元素
let exclusiveItems = Array.from(items).filter(item => {
return item.querySelector('span') && item.querySelector('span').textContent.trim() === xxx;
});
// 检查是否找到至少一个包含“专属型”文本的li元素
if (exclusiveItems.length > 0) {
// 获取最后一个匹配的li元素
let lastExclusiveItem = exclusiveItems[exclusiveItems.length - 1];
// 模拟点击最后一个匹配的li元素
lastExclusiveItem.click();
logMessage(`设置类型为:【` + xxx + `】`);
} else {
logMessage(`没有找到文本为【` + xxx + `】`);
}
} else {
logMessage('页面上没有找到【'+ xxx+ '】,是因为没出现多选框的列表吗?');
}
}
//点击【选择学员】
function clickLastSelectStudentButton() {
// 使用querySelectorAll来获取所有匹配的按钮元素
let buttons = document.querySelectorAll('button.el-button.el-button--primary');
// 筛选出包含文本“选择学员”的按钮
let selectStudentButtons = Array.from(buttons).filter(button => {
return button.querySelector('span') && button.querySelector('span').textContent.trim() === '选择学员';
});
// 统计找到的按钮数量
let count = selectStudentButtons.length;
//logMessage(`总共找到 ${count} 个文本为'选择学员'的按钮`);
// 检查是否找到至少一个按钮
if (count > 0) {
// 获取最后一个匹配的按钮
let lastSelectStudentButton = selectStudentButtons[count - 1];
// 模拟点击最后一个匹配的按钮
lastSelectStudentButton.click();
logMessage(`点击【选择学员】按钮`);
} else {
// 如果没有找到按钮,输出提示信息
logMessage('没有找到文本为"选择学员"的按钮');
}
}
//点击第前两项项复选框【开课中】、【未开课】
function countAndClickCheckbox() {
// 使用querySelectorAll来获取所有匹配的复选框元素
let checkboxes = document.querySelectorAll('input[type="checkbox"].el-checkbox__original');
// 统计找到的复选框数量
let count = checkboxes.length;
//logMessage(`总共找到 ${count} 个复选框`);
// 检查是否找到至少一个复选框
if (count > 0) {
// 获取并点击第1和第2个复选框
//第一个复选框是【开课中】学员
//第二个复选框是【未开课】学员
//如果先勾选的学员数为0,则勾选下一个复选框的时候会自动把刚刚那个取消掉。问题不大。
let firstCheckbox = checkboxes[2];
firstCheckbox.click();
firstCheckbox = checkboxes[1];
firstCheckbox.click();
firstCheckbox = checkboxes[0];
firstCheckbox.click();
logMessage(`点击前3个复选框`);
} else {
// 如果没有找到复选框,输出提示信息
logMessage('没有找到复选框');
}
}
//点击【确认学员】
function countAndClickConfirmButton() {
// 使用querySelectorAll来获取所有匹配的按钮元素
let buttons = document.querySelectorAll('button.el-button.btn.btn-primary.el-button--primary');
// 统计找到的按钮数量
let count = buttons.length;
//logMessage(`总共找到 ${count} 个文本为'确认'的按钮`);
// 检查是否找到至少一个按钮
if (count > 0) {
// 获取第一个按钮并检查其文本内容
let firstButton = buttons[0];
if (firstButton.querySelector('span') && firstButton.querySelector('span').textContent.trim() === '确认') {
// 点击第一个按钮
firstButton.click();
logMessage(`点击【学员确认】`);
} else {
logMessage('第一个按钮的文本不是"确认"');
}
} else {
// 如果没有找到按钮,输出提示信息
logMessage('没有找到文本为"确认"的按钮');
}
}
//点击【发布】
function countAndClickReleaseButton() {
// 使用querySelectorAll来获取所有匹配的按钮元素
let buttons = document.querySelectorAll('button.el-button.release.el-button--primary');
// 统计找到的按钮数量
let count = buttons.length;
//logMessage(`总共找到 ${count} 个文本为'发布'的按钮`);
// 检查是否找到至少一个按钮
if (count > 0) {
// 获取第一个按钮并检查其文本内容
let firstButton = buttons[0];
if (firstButton.querySelector('span') && firstButton.querySelector('span').textContent.trim() === '发布') {
// 点击第一个按钮
firstButton.click();
logMessage(`点击【发布】`);
} else {
logMessage('第一个按钮的文本不是"发布"');
}
} else {
// 如果没有找到按钮,输出提示信息
logMessage('没有找到文本为"发布"的按钮');
}
}
//回退页面到【试卷库】
function pageback() {
setTimeout(() =>
{
logMessage('返回上一页,共2次');
window.history.back();
logMessage('返回上一页,第1次');
setTimeout(() =>
{
window.history.back();
logMessage('返回上一页,第2次');
}, 1000);
}, 1000);
}
})();
// 创建悬浮窗口的函数
function createLogWindow() {
// 创建悬浮窗口的容器
const logWindow = document.createElement('div');
logWindow.id = 'logWindow';
logWindow.style.position = 'fixed';
logWindow.style.top = '50px';
logWindow.style.left = '0px';
logWindow.style.width = '300px';
logWindow.style.height = '600px';
logWindow.style.backgroundColor = 'rgba(255, 255, 255, 0.5)'; // 半透明背景
logWindow.style.border = '1px solid #ccc';
logWindow.style.padding = '10px';
logWindow.style.boxShadow = '0 0 10px rgba(0,0,0,0.1)';
logWindow.style.zIndex = '1000';
logWindow.style.overflowY = 'auto'; // 允许内容滚动
logWindow.style.display = 'block';
// 创建头部
const logHeader = document.createElement('div');
logHeader.className = 'log-header';
logHeader.innerText = '脚本日志';
logHeader.style.color = 'blue'; // 头部文字颜色
// 创建关闭按钮
const closeButton = document.createElement('button');
closeButton.innerText = 'X';
closeButton.style.color = 'red'; // 关闭按钮文字颜色
closeButton.onclick = function() {
logWindow.style.display = 'none';
};
// 创建复制按钮
const copyButton = document.createElement('button');
copyButton.innerText = '复制';
copyButton.style.color = 'green'; // 复制按钮文字颜色
copyButton.onclick = function() {
const logContent = document.querySelector('#logWindow .log-content');
copyTextToClipboard(logContent.innerText);
alert('日志已复制到剪贴板');
};
// 创建日志内容区域
const logContent = document.createElement('div');
logContent.className = 'log-content';
logContent.style.fontFamily = 'monospace';
logContent.style.whiteSpace = 'pre-wrap';
logContent.style.color = 'blue'; // 日志内容文字颜色
logContent.style.fontSize = '14px'; // 设置字体大小
logContent.style.overflowY = 'auto'; //设置超出范围自动滚动
// 组装悬浮窗口
logHeader.appendChild(closeButton);
logWindow.appendChild(logHeader);
logWindow.appendChild(logContent);
logHeader.appendChild(copyButton); // 将复制按钮添加到头部
// 将悬浮窗口添加到文档中
document.body.appendChild(logWindow);
return logContent;
}
// 向日志窗口添加消息的函数
function logMessage(message) {
const logContent = document.querySelector('.log-content');
const newEntry = document.createElement('div');
newEntry.textContent = message;
logContent.appendChild(newEntry);
logContent.scrollTop = logContent.scrollHeight;
}
// 复制文本到剪贴板的函数
function copyTextToClipboard(text) {
if (navigator.clipboard) {
navigator.clipboard.writeText(text).then(
function() {
console.log('已成功将日志复制到剪贴板');
},
function(err) {
console.error('复制到剪贴板失败', err);
}
);
} else {
const textArea = document.createElement("textarea");
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
document.execCommand('copy');
console.log('Fallback: Copying to clipboard was successful!');
} catch (err) {
console.error('Fallback: Could not copy text: ', err);
}
document.body.removeChild(textArea);
}
}