版权狗退散 — 仿知乎复制文本自带版权声明

什么鬼?

版权狗退散,妈妈再也不用担心我被侵权了(其实只防君子不防小人)。

类似知乎,在网站复制长度大于42的文本时自动加上这样的版权声明:

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:DIYgod
链接:https://www.anotherhome.net/
来源:Anotherhome

原理

  • 监听copy事件

  • 使用 window.getSelection() 获取选中的文本

  • 使用 clipboardData.setData 操作剪贴板的内容

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
document.body.addEventListener('copy', function (e) {
if (window.getSelection().toString() && window.getSelection().toString().length > 42) {
setClipboardText(e);
alert('商业转载请联系作者获得授权,非商业转载请注明出处,谢谢合作。');
}
});

function setClipboardText(event) {
var clipboardData = event.clipboardData || window.clipboardData;
if (clipboardData) {
event.preventDefault();

var htmlData = ''
+ '著作权归作者所有。<br>'
+ '商业转载请联系作者获得授权,非商业转载请注明出处。<br>'
+ '作者:DIYgod<br>'
+ '链接:' + window.location.href + '<br>'
+ '来源:Anotherhome<br><br>'
+ window.getSelection().toString();
var textData = ''
+ '著作权归作者所有。\n'
+ '商业转载请联系作者获得授权,非商业转载请注明出处。\n'
+ '作者:DIYgod\n'
+ '链接:' + window.location.href + '\n'
+ '来源:Anotherhome\n\n'
+ window.getSelection().toString();

clipboardData.setData('text/html', htmlData);
clipboardData.setData('text/plain',textData);
}
}

已知问题

iOS Safari 不兼容 clipboardData.setData() 方法,所以在 iOS Safari 上无效

知乎原版

另附知乎原版关键代码,原理类似,感兴趣也可以看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var lz = function (a, b, c) {
function d(a, b) {
return ["著作权归作者所有。", "商业转载请联系作者获得授权,非商业转载请注明出处。", "作者:" + b, "链接:" + a, "来源:知乎", "", ""]
}

function f(a, b, c) {
return "\x3cdiv\x3e" + d(b, c).join("\x3cbr /\x3e") + a + "\x3c/div\x3e"
}

function g(a) {
var g = z.Wq(), m = g && (0, z.ib)(g.Ed());
if (m && !(42 > m.length)) {
if ("object" === typeof a.originalEvent.clipboardData && (a.originalEvent.clipboardData.setData("text/html", f(g.Of(), b, c)), a.originalEvent.clipboardData.setData("text/plain", d(b, c).join("\n") + m), 0 < a.originalEvent.clipboardData.getData("text/plain").length)) {
a.preventDefault();
return
}
if (window.getSelection) {
a = g.Of();
var n = (0, window.$)(f(a, b, c)).css({position: "fixed", left: "-9999px"}).appendTo("body");
window.getSelection().selectAllChildren(n.get(0));
(0, window.setTimeout)(function () {
g.select();
n.remove()
}, 200)
}
}
}

a && b && c && (z.Fa(b, "http") || (b = window.location.protocol + "//" + window.location.host + b), a.on("copy", g))
};
分享到:
Disqus 加载中...

如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理