banner
DIYgod

Hi, DIYgod

写代码是热爱,写到世界充满爱!
github
twitter
follow
bilibili
telegram
email
steam
playstation
nintendo switch

版權狗退散 — 仿知乎複製文本自帶版權聲明

什麼鬼?#

版權狗退散,媽媽再也不用擔心我被侵權了(其實只防君子不防小人)。

類似知乎,在網站複製長度大於 42 的文本時自動加上這樣的版權聲明:

著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
作者:DIYgod
連結:https://www.anotherhome.net/
來源:Anotherhome

原理#

  • 監聽 copy 事件

  • 使用 window.getSelection () 獲取選中的文本

  • 使用 clipboardData.setData 操作剪貼簿的內容

代碼#

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 上無效

知乎原版#

另附知乎原版關鍵代碼,原理類似,感興趣也可以看看:

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))
};
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。