[解決済み] コピーしたウェブテキストに余分な情報を追加する方法
質問
現在、いくつかのWebサイトでは、JavaScriptのサービスを Tynt の JavaScript サービスを使って、コピーしたコンテンツにテキストを追加しているサイトもあります。
これを使用してサイトからテキストをコピーし、貼り付けると、テキストの下に元のコンテンツへのリンクが表示されます。
Tynt は、これが発生すると追跡します。これは巧妙なトリックで、よくできています。
クリップボードを操作しようとするのではなく (これは古いバージョンの IE でのみデフォルトで可能で、常にオフにすべきです)、実際の選択部分を操作するのです。
そのため、テキストのブロックを選択すると、余分なコンテンツは隠された
<div>
として追加され、選択範囲に含まれます。貼り付けると、余分なスタイルは無視され、余分なリンクが表示されます。
これは実際には単純なテキスト ブロックではかなり簡単ですが、異なるブラウザで複雑な HTML 全体で可能なすべての選択を考慮すると、悪夢となります。
私は Web アプリケーションを開発しています。誰にもコピーされたコンテンツを追跡されたくないので、追加情報には、単なるリンクではなく、何か文脈的なものが含まれていることを望みます。この場合、Tynt のサービスはあまり適切ではありません。
同様の機能を提供し、内部アプリケーション データを公開しない、オープン ソースの JavaScript ライブラリ (jQuery プラグインまたは同様のもの) をご存知の方はいらっしゃいますか?
どのように解決するのですか?
2022年最新情報
リッチ テキスト フォーマットを処理する、より複雑なソリューションです。プレーン テキストのみを扱うのであれば、2020 年のソリューションがまだ適切です。
const copyListener = (e) => {
const range = window.getSelection().getRangeAt(0),
rangeContents = range.cloneContents(),
pageLink = `Read more at: ${document.location.href}`,
helper = document.createElement("div");
helper.appendChild(rangeContents);
event.clipboardData.setData("text/plain", `${helper.innerText}\n${pageLink}`);
event.clipboardData.setData("text/html", `${helper.innerHTML}<br>${pageLink}`);
event.preventDefault();
};
document.addEventListener("copy", copyListener);
#richText {
width: 415px;
height: 70px;
border: 1px solid #777;
overflow: scroll;
}
#richText:empty:before {
content: "Paste your copied text here";
color: #888;
}
<h4>Rich text:</h4>
<p>Lorem <u>ipsum</u> dolor sit <b>amet</b>, consectetur <i>adipiscing</i> elit.</p>
<h4>Plain text editor:</h4>
<textarea name="textarea" rows="5" cols="50" placeholder="Paste your copied text here"></textarea>
<h4>Rich text editor:</h4>
<div id="richText" contenteditable="true"></div>
2020年最新情報
すべてに対応するソリューション 最近の ブラウザで動作します。
このソリューションでは、リッチ テキスト エディタに貼り付ける場合でも、リッチ テキストの書式設定 (太字や斜体など) が除去されることに注意してください。
document.addEventListener('copy', (event) => {
const pagelink = `\n\nRead more at: ${document.location.href}`;
event.clipboardData.setData('text/plain', document.getSelection() + pagelink);
event.preventDefault();
});
Lorem ipsum dolor sit <b>amet</b>, consectetur <i>adipiscing</i> elit.<br/>
<textarea name="textarea" rows="7" cols="50" placeholder="paste your copied text here"></textarea>
[古い記事 - 2020年アップデート前】の記事です。]
コピーしたWebテキストに余分な情報を追加するには、主に2つの方法があります。
- 選択範囲を操作する
を見ることです。
copy event
を監視し、追加情報を含む隠しコンテナを
dom
に追加し、選択範囲をそれに拡張します。
このメソッドは
この記事
によって
c.bavota
. こちらもご覧ください
ジットビット
のバージョン
を使用すると、より複雑なケースに対応できます。
- ブラウザの互換性 : すべての主要なブラウザ、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);
- クリップボードの操作
を見ることです。
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);
関連
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトにキーと値のペアを追加するにはどうすればよいですか?
-
[解決済み] 指定された要素にクラスを追加するには?
-
[解決済み] Trelloはどのようにユーザーのクリップボードにアクセスするのですか?
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] ECMAScriptとは?
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] javascriptで2つの数値を連結する方法は?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?