如何自己写个脚本来解除网站复制限制
最近有个期末作业需要用到知网,作为一个有良好的复制粘贴素养的青年,那ctrl c是必不可少的
以知网在线阅读为例,在这里复制会有很多限制
- 限制右键菜单
- 限制ctrl c快捷键
- 不能复制大量文本,会被截取并且还会弹窗。。。
消除恐惧的最好办法就是面对恐惧,那当然是找个脚本解决它
可惜在网上没有找到针对知网在线阅读的脚本或插件,于是就有了这篇博客
该脚本已发布在油猴: https://greasyfork.org/zh-CN/scripts/393843-%E8%A7%A3%E9%99%A4%E7%9F%A5%E7%BD%91%E5%A4%8D%E5%88%B6%E9%99%90%E5%88%B6cnki-copy
首先解除ctrl c限制
先从简单的开始,先突破ctrl c的限制
document.body.onkeydown=function(e){ // 监听键盘事件 if(e.ctrlKey && e.keyCode == 67) { try{ // 手动添加到剪贴板 if(document.execCommand("Copy","false",null)){ console.log("复制成功!"); }else{ console.warn("复制失败!"); } }catch(err){ console.warn("复制错误!") } } }
接着替换掉复制按钮的逻辑
经过对网页的分析,发现复制按钮绑定了一个匿名事件处理函数,所以没法直接移除点击事件也没法覆盖它
于是我想着直接生成一个新按钮来替换它
// 前面的可以根据网站实际情况调整 var copytext = document.getElementById("copytext"); var parent = document.getElementsByClassName("inner")[0]; if(copytext!= null) parent.removeChild(copytext); // 生成新按钮 var proxyBtn = document.createElement("A"); // 插入这个按钮 parent.insertBefore(proxyBtn,parent.children[0]); // 设置属性与文本 proxyBtn.setAttribute("id","proxy"); proxyBtn.innerHTML="复制";
本来想着完工了,接着加点击事件监听然后和ctrl c一样的处理逻辑就行了
但是发现当我点击复制按钮时,document.execCommand并没有复制到东西,剪贴板没有覆盖上新内容
我估计是因为点击按钮导致文本域框选失去了焦点导致复制了空内容
那么只要我生成一个隐藏的DOM来存放框选的文本,然后在select它那么就可以成功execCommand了
var selectText = ""; // 当鼠标框选结束,松开点击时就去获取框选的文本 document.body.onmouseup = function(e){ getSelectText(); } function getSelectText() { if(document.selection) { if(document.selection.createRange().text && document.selection.createRange().text !== ''){ // 只有当真正框选到内容时才去修改全局selectText selectText = document.selection.createRange().text; } } else { if(document.getSelection()&& document.getSelection().toString() !== ''){ // 只有当真正框选到内容时才去修改全局selectText selectText = document.getSelection().toString(); } }
}
最后监听点击复制按钮
// 这里的proxy是之前自己生成的按钮, id自定义成了proxy
document.getElementById("proxy").onclick = function(e){
// 判断是否存在自己生成的隐藏节点 if(document.getElementById("aukoToProxy")){
// 若存在则直接赋值 document.getElementById("aukoToProxy").value = selectText; }else{
// 不存在则生成一个隐藏节点 var temp = document.createElement('input'); temp.value = selectText; temp.setAttribute("id","aukoToProxy"); document.body.appendChild(temp);
// 这里select之后, 就可以顺利通过document.execCommand来复制了 temp.select(); temp.style.displau='none'; }
// 这里去调用document.execCommand copy(); }
终于可以舒服的复制粘贴了...