运行结果

添加三个按钮,DEL删除多余元素,(刷新复原)
COPY一键复制所有题目和选项的文本至剪切板中,暂不支持图片复制。(不记录正确答案)
鼠标移至文字上方即可显示“复制”、“必应搜索”两个按钮。
DISABLE可以禁用“复制”、“必应搜索”避免影响做题,禁用后将变成ABLE按钮。
可以用"x"关闭按钮,关闭后会变成"s",再次点击按钮会重现。

下图是个GIF图,如果不会动,请右键在新标签页打开它。

完整代码

GreasyFork链接(可直接安装)

具体代码有点长,就不贴了,下面记录部分实现细节。

可复用的部分

1. 删除指定Class或Id的DOM元素

function delAll(){
var delClass=["qaCate","m-nav-container","scoreLabel","m-learnhead","m-learnleft","totalScore","u-learn-moduletitle","j-activityBanner","j-activityBanner"],i,j;
var delId=['j-activityBanner'];
//注意倒序删除,先删除前面的结点时,js会自动补全dom列表
for(i=delClass.length-1;i>=0;i--)
{
let list=document.getElementsByClassName(delClass[i]);
for(j=list.length-1;j>=0;j--)
{
list[j].remove();
}
}
for(i=delId.length-1;i>=0;i--)
{
let dom=document.getElementById(delId[i]);
dom.remove();
}
}

2. 在页面上添加按钮并绑定事件、添加css、class

function createAButton(element,value,onclick,css,cla="temp"){
var Button = document.createElement("input");
Button.type="button";
Button.value=value;
Button.onclick=onclick;
Button.setAttribute("style",css) ;
Button.setAttribute("class",cla) ;
element.appendChild(Button);
return Button;
}

3. 等待页面加载完成,运行异步函数

function Func(){
var p1 = new Promise(usualFunc);
//Func(resolve,reject),resolve返回到then,reject返回到catch
p1.then(function (result) {
//code here.
});
}
async function mainFunc(){
await Func();
} var oldonload = window.onload;
if(typeof window.onload !='function'){
window.onload = mainFunc;
}else{
window.onload = function(){
oldonload();
mainFunc();
}

4. 选中某个DOM元素的文本并复制

默认不移除被复制节点

function selectText(element) {
if (document.createRange) {
let range = document.createRange();
range.selectNodeContents(element);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
} else {
alert('none');
}
}
function copyAll(element,del=0){
selectText(element);
if (document.execCommand('copy')) {
Toast("复制成功",500);
if(del){
element.remove();
}
}
}

5. 数组去重(ES6支持)

function unique (arr) {
return Array.from(new Set(arr))
}

6. 递归获得特定Class或者Id的子节点

var childList=[];
function getDeepChildByOrder(limit){
let copyClass=["position","f-richEditorText","optionPos"],i,j;
let copyId=[];
var child=limit.children;
for(i=0;i<child.length;i++){
for(j=0;j<copyClass.length;j++){
if(child[i].className.includes(copyClass[j])){
childList.push(child[i]);
//console.log(child[i].innerText);
}
}
for(j=0;j<copyId.length;j++){
if(child[i].id==copyId[i]){
childList.push(child[i]);
//console.log(child[i]);
}
}
if(child[i].children){
getDeepChildByOrder(child[i]);
}
}
}

7. 向DOM元素中追加文本(包括\n换行)

换行用<br>元素实现。

function addTextWithBR(element,str){
var textNode,i;
str=str.split(/[\n]/);//分割字符串
for(i=0;i<str.length;i++){
textNode=document.createTextNode(str[i]);
element.appendChild(textNode);
//注:appendChild不能通过重复调用添加两个相同节点
//所以最好重新定义一个br节点添加
//注2:为保证换行的正确性,最后一个分割字符串末尾不需要加换行
if(i!=str.length-1){
let br=document.createElement('br');
element.appendChild(br);
}
}
}

8. Toast实现(轻弹窗)

function Toast(msg, duration) {
duration = isNaN(duration) ? 3000 : duration;
var m = document.createElement('div');
m.innerHTML = msg;
m.style.cssText = "font-family:siyuan;max-width:60%;min-width: 150px;padding:0 14px;height: 40px;color: rgb(255, 255, 255);line-height: 40px;text-align: center;border-radius: 4px;position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);z-index: 999999;background: rgba(0, 0, 0,.7);font-size: 16px;";
document.body.appendChild(m);
setTimeout(function() {
var d = 0.5;
m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
m.style.opacity = '0';
setTimeout(function() {
document.body.removeChild(m)
}, d * 1000);
}, duration);
}

9. sleep函数以及正确使用方式

function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
async function Func(){
await sleep(1000);
console.log('结合async使用就不至于阻塞');
}
Func();

10. forEach不能对空数组遍历

以上便是本次代码的所有需求和难点。

【MOOC】JS脚本|便于复制粘贴中国大学MOOC网站的测试题和选项的更多相关文章

  1. 中国大学MOOC课程信息爬取与数据存储

    版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82016583 10月18日更:MOOC课程信息D3.js ...

  2. 【python】下载中国大学MOOC的视频

    [python]下载中国大学MOOC的视频 脚本目标: 输入课程id和cookie下载整个课程的视频文件,方便复习时候看 网站的反爬机制分析: 分析数据包的目的:找到获取m3u8文件的路径 1. 从第 ...

  3. 中国大学MOOC中的后台文件传输

    早期版本的中国大学MOOC一旦被挂起后,应用在完成当前下载任务后无法继续添加新任务,当然也无法将缓存状态写入数据库.这个问题能否顺利解决直接关系到用户体验. 顺便吐槽下,凡是使用了后台文件传输还提示你 ...

  4. Cocos Creator JS web平台复制粘贴代码(亲测可用)

    Cocos Creator JS web平台复制粘贴代码(亲测可用) 1 webCopyString: function(str){ var input = str; const el = docum ...

  5. 中国大学mooc直播回放看这里哦http://www.icourse163.org/forum/1001974001/topic-1003372881.htm?sortType=1&pageIndex=1

    中国大学mooc直播回放看这里哦http://www.icourse163.org/forum/1001974001/topic-1003372881.htm?sortType=1&pageI ...

  6. 中国大学MOOC课程信息之数据分析可视化二

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82318571 - 写在前面 本篇博客继续对中国大学MOOC ...

  7. 中国大学MOOC课程信息之数据分析可视化一

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82263391 9月2日更:中国大学MOOC课程信息之数据分 ...

  8. 中国大学MOOC 邮箱验证的问题

    在使用 中国大学 MOOC 过程中,在PC端修改个人资料时,其中有项“常用邮箱”,于是写了QQ邮箱,结果发现一直无法验证,连邮件都无法收到. 经过多番尝试,重新使用邮箱注册的方式注册账号,然后注册成功 ...

  9. fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能

    用vue写的 显示,隐藏 hide(){ this.canvas.getActiveObject().set('opacity', 0).setCoords(); this.canvas.reques ...

  10. js来监控复制粘贴

    平时我们在复制网页上面代码到控制台调试时,有时会出现复制过来的代码后面加上了一下描述信息(作者.版权等信息),每次需要删除才能运行,所以今天看看怎么能保证我们粘贴的代码不携带这些信息呢? (funct ...

随机推荐

  1. FreeSql学习笔记——11.LinqToSql

    前言   Linq的强大大家有目共睹,可以以简便的方式对数据集进行复杂操作,LinqToSql经常使用在数据库的联表.分组等查询操作中:FreeSql对LinqToSql的支持通过扩展包FreeSql ...

  2. P5384 [Cnoi2019] 雪松果树 题解

    传送门 前言 一年一度,生长在高山上的雪松果树又结果了. 第二天,雪松果树长成了一颗参天大树, 上面长满了雪松果. 求雪松果树生长周期 整活向题解. 奋力卡常 3h,纪念一下. 是的,我一个人的提交占 ...

  3. flutter-构造方法给数组list默认空值

    1 class NewstStyle extends StatelessWidget { 2 final List<DkCenterUpload> upload; 3 const News ...

  4. 【整活向】把tidb的文档塞给了基于oceanbase的RAG机器人

    最近官方推出了免费试用365天的云数据库,版本也升级到了4.3.支持了向量功能. 官方推出了活动体验AI的动手实战活动, 教程中使用了docker单机版数据库,既然有免费的云数据库,就优先使用云数据库 ...

  5. ADF - [02] 概念

    题记部分 001 || 管道和活动 一个数据工厂可以有一个或多个管道(Pipeline).管道是共同执行一项任务的活动的逻辑分组.管道可以包含一组活动(Activity),这些活动引入和清除日志数据, ...

  6. 百万架构师第四十五课:并发编程的基础|JavaGuide

    课程目标 1. 多线程的发展历史 2. 线程的应用 3. 并发编程的基础 4. 线程安全的问题 特定的指令,计算机不会存储指令,把指令写下来,一次性读取指令,批处理. 然后我们需要把批处理进行隔离.保 ...

  7. Selenium WebDriver上创建 WebDriver测试脚本

    本文实现一个WebDriver测试脚本,介绍WebDrive的常用命令.UI元素定位的策略以及在脚本中的使用,还有Get命令. 你将学到:  脚本创建  代码走查  测试执行  定位Web元素 ...

  8. 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

    概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进 ...

  9. angular使用nz-zorro的时间选择器,设置可选时间范围

    备份一下 https://blog.csdn.net/qq_34790644/article/details/87098960 https://blog.csdn.net/fsxxzq521/arti ...

  10. MySQL REPLACE函数:字符串替换

    语法 REPLACE ( string_expression , string_pattern , string_replacement ) 替换字符串,接受3个参数,分别是原字符串,被替代字符串,替 ...