web関連
【javascript】pタグやdivタグとかのテキストをクリックしたらコピーする方法
pタグやdivタグの中身のテキストをクリックしたらコピーする機能を実装するときにノードを揃えて作業をする必要性があり悩んだので備忘録
inputタグで入力した内容をコピーする方法であれば前回やった備忘録があるのでリンク貼っときます
Memo:execCommandが廃止なのでClipboard APIを使った書き方を載せている
ノードを操作してpタグの中身をコピーできるようにする必要性がある
javascriptで何か要素を追加しようとする時にノードを操作して追加する必要性があるんだけど、pタグ等をクリックしてコピーする機能を実装しようとする時もノードを操作する必要性があるみたい
<p id="copy">Copyする文言が入ります。</p>
<script>
function copy() {
// ↓ Rangeオブジェクト作成
let range = document.createRange();
// ↓ コピーする要素を取得
let copyTarget = document.getElementById("copy");
// ↓ #copyの要素全体を選択
range.selectNodeContents(copyTarget);
// ↓ 選択した要素(ノード)の文字列を取得(selectionオブジェクトを取得)
let selection = document.getSelection();
// ↓ 選択した範囲を解除(これがないと次のaddRangeが上手く動かない)
selection.removeAllRanges();
// ↓ selectionオブジェクトにrangeオブジェクトを追加
selection.addRange(range);
document.execCommand("copy");// クリップボードにコピー
selection.removeAllRanges();// テキスト選択を解除
}
document.getElementById("copy").addEventListener("click", copy);
</script>
selectionオブジェクトはマウスでクリックしてテキストとかを選択したときに呼び出されるオブジェクトみたい
色々と調べながらやってたんだけどaddRange()
がよくわからん
addRange
メソッドは選択範囲が既に存在していると上手く動かないみたいで直前でremoveAllRanges
メソッドを使って選択範囲を解除している
そして、最後にテキストの選択を解除するためのremoveAllRanges()
を使ってるんだけど最初のremoveAllRanges()
で解除されないのだろうか?
時間があったらもう少し調べたい
Memo:要素を選択したら選択した範囲が表示されるデモがある