コピーしたWebテキストに追加情報を追加する方法


103

一部のWebサイトでは、コピーされたコンテンツにテキストを追加するTyntの JavaScriptサービスを使用しています。

これを使用してサイトからテキストをコピーして貼り付けると、テキストの下部にある元のコンテンツへのリンクが表示されます。

Tyntはまた、これが発生したときに追跡します。それはよくできたきちんとしたトリックです。

これを行うためのスクリプトは印象的です-クリップボードを操作しようとするのではなく(古いバージョンのIEだけがデフォルトで操作でき、常にオフにしておく必要があります)、実際の選択を操作します。

したがって、テキストのブロックを選択すると、追加のコンテンツが<div>選択に含まれる非表示として追加されます。貼り付けると、余分なスタイルは無視され、余分なリンクが表示されます。

これは実際には単純なテキストブロックでかなり簡単に実行できますが、さまざまなブラウザーの複雑なHTMLで可能なすべての選択を検討するときの悪夢です。

私はWebアプリケーションを開発しています-コピーされたコンテンツを誰にも追跡できないようにしたいので、リンクではなくコンテキストに何かを追加情報に含めたいです。この場合、Tyntのサービスは実際には適切ではありません。

同様の機能を提供するが内部アプリケーションデータを公開しないオープンソースのJavaScriptライブラリ(jQueryプラグインなど)を知っている人はいますか?


1
stackoverflow.com/questions/6344588/…で私の回答をご覧ください。それはあなたが提案したのと非常によく似ています
Niklas


48
これを行わないでください。どうぞご遠慮ください。
カウチ、2015年

5
@couchandなぜですか?これがスパムサイトでいらいらしますが、これは引用に使用できるアプリケーション用であり、内部データの機密性が高い場所です。Tyntを使いたくなかったのはそのためです。
キース

4
これを実行してもよろしいですか?ユーザーとしては嫌いです。この怒りを製品に移植します。クリップボードに触れないでください。
aloisdgがcodidact.comに移動

回答:


138

2020年の更新

最近のすべてブラウザで機能するソリューション。

document.addEventListener('copy', (event) => {
  const pagelink = `\n\nRead more at: ${document.location.href}`;
  event.clipboardData.setData('text', document.getSelection() + pagelink);
  event.preventDefault();
});
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br/>
<textarea name="textarea" rows="7" cols="50" placeholder="paste your copied text here"></textarea>


[古い投稿-2020年の更新前]

コピーしたWebテキストに追加情報を追加するには、主に2つの方法があります。

1.選択の操作

アイデアはを監視し、copy event非表示のコンテナに追加情報をに追加しdom、選択範囲をに拡張することです。
このメソッドは、c.bavotaによるこの記事基にしています。より複雑なケースについては、jitbitのバージョンも確認してください。

  • ブラウザーの互換性:すべての主要なブラウザー、IE> 8。
  • デモjsFiddleデモ
  • JavaScriptコード

    function addLink() {
        //Get the selected text and append the extra info
        var selection = window.getSelection(),
            pagelink = '<br /><br /> Read more at: ' + document.location.href,
            copytext = selection + pagelink,
            newdiv = document.createElement('div');

        //hide the newly created container
        newdiv.style.position = 'absolute';
        newdiv.style.left = '-99999px';

        //insert the container, fill it with the extended text, and define the new selection
        document.body.appendChild(newdiv);
        newdiv.innerHTML = copytext;
        selection.selectAllChildren(newdiv);

        window.setTimeout(function () {
            document.body.removeChild(newdiv);
        }, 100);
    }

    document.addEventListener('copy', addLink);

2.クリップボードの操作

アイデアはcopy event、クリップボードデータを監視して直接変更することです。これはclipboardDataプロパティを使用して可能です。このプロパティは、のすべての主要ブラウザで使用できますread-only。このsetDataメソッドはIEでのみ使用できます。

  • ブラウザの互換性:IE> 4。
  • デモjsFiddleデモ
  • JavaScriptコード

    function addLink(event) {
        event.preventDefault();

        var pagelink = '\n\n Read more at: ' + document.location.href,
            copytext =  window.getSelection() + pagelink;

        if (window.clipboardData) {
            window.clipboardData.setData('Text', copytext);
        }
    }

    document.addEventListener('copy', addLink);

1
乾杯!残念ながらIEで動作させる必要がありますが、それは悪いスタートではありません。
Keith

2
「<pre>」タグの回避策があるはずです。このスクリプトのよりスムーズなバージョンはこちらです
Alex

15
に変更window.clipboardDataした場合、「クリップボードの操作」はFireFox、Chrome、Safariで完全に機能することに注意してくださいevent.clipboardData。IE(v11も)はevent.clipboardData jsfiddle.net/m56af0je/8を
mems

3
Google Analyticsなどを使用している場合は、イベントを開始して、ユーザーがサイトからコピーしている内容をログに記録することもできます。面白い
geedubb

2
最初のオプションは、コピーされたテキストの改行文字を無視します。
ソハム

7

これは、上記の修正されたソリューションからのバニラJavaScriptソリューションですが、より多くのブラウザー(クロスブラウザーメソッド)をサポートしています

function addLink(e) {
    e.preventDefault();
    var pagelink = '\nRead more: ' + document.location.href,
    copytext =  window.getSelection() + pagelink;
    clipdata = e.clipboardData || window.clipboardData;
    if (clipdata) {
        clipdata.setData('Text', copytext);
    }
}
document.addEventListener('copy', addLink);

3

私がテストして機能しているjQueryの最短バージョンは次のとおりです。

jQuery(document).on('copy', function(e)
{
  var sel = window.getSelection();
  var copyFooter = 
        "<br /><br /> Source: <a href='" + document.location.href + "'>" + document.location.href + "</a><br />© YourSite";
  var copyHolder = $('<div>', {html: sel+copyFooter, style: {position: 'absolute', left: '-99999px'}});
  $('body').append(copyHolder);
  sel.selectAllChildren( copyHolder[0] );
  window.setTimeout(function() {
      copyHolder.remove();
  },0);
});

結果を実際にクリップボードにコピーするコードはどこにありますか?
vsync 2016年

@vsyncこれにより、コピーが行われる直前に機能が追加されると思います(これは、ユーザーが開始したときにシステムによって行われます)。
TerranRich

@vsync-TerraRichが言ったように、私はコピーされたテキストに追加情報を追加することに関する質問に答えようとしたので、解決策はこの部分のみをカバーしています。
user2276146

3

これを行うためのjqueryのプラグインは次のとおりです ユーザーが選択したものとは異なります。

これにより、著作権情報やその他のコンテンツなどのコンテンツを選択範囲に追加/追加できます。

MITライセンスの下でリリースされました」


1
それは非常に有望に見えます。これは、CSPで許可されていないインラインスタイルを使用していますが、適応できる可能性があります。乾杯!
キース

3

答えを改善するには、コピー後にランダムに選択されないように、変更後に選択を復元します。

function addLink() {
    //Get the selected text and append the extra info
    var selection = window.getSelection(),
        pagelink = '<br /><br /> Read more at: ' + document.location.href,
        copytext = selection + pagelink,
        newdiv = document.createElement('div');
    var range = selection.getRangeAt(0); // edited according to @Vokiel's comment

    //hide the newly created container
    newdiv.style.position = 'absolute';
    newdiv.style.left = '-99999px';

    //insert the container, fill it with the extended text, and define the new selection
    document.body.appendChild(newdiv);
    newdiv.innerHTML = copytext;
    selection.selectAllChildren(newdiv);

    window.setTimeout(function () {
        document.body.removeChild(newdiv);
        selection.removeAllRanges();
        selection.addRange(range);
    }, 100);
}

document.addEventListener('copy', addLink);

@TsukimotoMitsumasaがあるはずですvar range = selection.getRangeAt(0);
Vokiel

テキストの選択を復元することは良い考えです、そうでなければ、それはデフォルトのブラウザの動作を壊します。
セルゲイ

2

2018年の改善

document.addEventListener('copy', function (e) {
    var selection = window.getSelection();
    e.clipboardData.setData('text/plain', $('<div/>').html(selection + "").text() + "\n\n" + 'Source: ' + document.location.href);
    e.clipboardData.setData('text/html', selection + '<br /><br />Source: <a href="' + document.location.href + '">' + document.title + '</a>');
    e.preventDefault();
});

1
コピーして貼り付けると、フォーマットが失われます(<a><img><b>およびその他のタグ)。選択したテキストのHTMLコードを取得することをお勧めします。この回答からgetSelectionHtml()関数を使用してください:[ stackoverflow.com/a/4177234/4177020]そして、この文字列var selection = window.getSelection();を次のものに置き換えることができます:var selection = getSelectionHtml();
Dmitry Kulahin

0

また、少し短い解決策:

jQuery( document ).ready( function( $ )
    {
    function addLink()
    {
    var sel = window.getSelection();
    var pagelink = "<br /><br /> Source: <a href='" + document.location.href + "'>" + document.location.href + "</a><br />© text is here";
    var div = $( '<div>', {style: {position: 'absolute', left: '-99999px'}, html: sel + pagelink} );
    $( 'body' ).append( div );
    sel.selectAllChildren( div[0] );
    div.remove();
    }



document.oncopy = addLink;
} );

0

上記の2つの回答とMicrosoft Edgeとの互換性をまとめたものです。

また、どのブラウザーでもデフォルトで予期されるように、最後に元の選択の復元を追加しました。

function addCopyrightInfo() {
    //Get the selected text and append the extra info
    var selection, selectedNode, html;
    if (window.getSelection) {
        var selection = window.getSelection();
        if (selection.rangeCount) {
            selectedNode = selection.getRangeAt(0).startContainer.parentNode;
            var container = document.createElement("div");
            container.appendChild(selection.getRangeAt(0).cloneContents());
            html = container.innerHTML;
        }
    }
    else {
        console.debug("The text [selection] not found.")
        return;
    }

    // Save current selection to resore it back later.
    var range = selection.getRangeAt(0);

    if (!html)
        html = '' + selection;

    html += "<br/><br/><small><span>Source: </span><a target='_blank' title='" + document.title + "' href='" + document.location.href + "'>" + document.title + "</a></small><br/>";
    var newdiv = document.createElement('div');

    //hide the newly created container
    newdiv.style.position = 'absolute';
    newdiv.style.left = '-99999px';

    // Insert the container, fill it with the extended text, and define the new selection.
    selectedNode.appendChild(newdiv); // *For the Microsoft Edge browser so that the page wouldn't scroll to the bottom.

    newdiv.innerHTML = html;
    selection.selectAllChildren(newdiv);

    window.setTimeout(function () {
        selectedNode.removeChild(newdiv);
        selection.removeAllRanges();
        selection.addRange(range); // Restore original selection.
    }, 5); // Timeout is reduced to 10 msc for Microsoft Edge's sake so that it does not blink very noticeably.  
}

document.addEventListener('copy', addCopyrightInfo);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.