8192.jp

jQueryを使ってテキストをクリップボードにコピーするボタンを作成する方法

Web制作 2021/11/16 2021/11/16

なんとなーく気になったので調べてみました。コードを公開するようなサイトだと使えそうです。

目次

    基本形

    HTML

    コピーさせたいテキストにはcopy_txtというクラスを、コピーを実行するボタンにはcopy_btnというクラスを付与します。

    <div class="copy_wrap">
    	<div class="copy_txt">三└(┐卍^o^)卍ドゥルルルルル</div>
    	<button type="button" class="copy_btn">Copy</button>
    </div>

    jQuery

    解説は後述します。

    $(function() {
    	$('.copy_btn').on('click', function(){
    		let text = $('.copy_txt').text();
    		let textarea = $('<textarea></textarea>');
    		textarea.text(text);
    		$(this).append(textarea);
    		textarea.select();
    		document.execCommand('copy');
    		textarea.remove();
    		alert('「'+text+'」をコピーしました');
    	});
    });
    $('.copy_btn').on('click', function(){

    copy_btnがクリックされたら実行。

    let text = $('.copy_txt').text();

    変数「text」にcopy_txtの中身をセット。

    let textarea = $('<textarea></textarea>');

    変数「textarea」に空のtextarea要素をセット。

    textarea.text(text); $(this).append(textarea);

    先程作成した空のtextareaの中にtextをセットし、HTML内に追加。

    textarea.select(); document.execCommand('copy'); textarea.remove();

    textareaを選択状態にし、コピーを実行。そして用済みのtextareaは削除。

    alert('「'+text+'」をコピーしました');

    コピーが実行されたことをアラートで通知して終わり。

    実行結果

    これで「Copy」ボタンを押すと特定の要素内のテキストをクリップボードにコピーさせることが可能になりました。
    やっている事はシンプルなんですが、divのテキストをコピーさせるとなると地味に記述が長いですね…

    See the Pen jQueryClipboard - 1 by Leo_8192 (@Leo_8192) on CodePen.

    これで完成…と言いたい所なんですが、ページ内に複数のcopy_txtがあると丸ごとコピーされてしまうので、ちょっと改造してみます。

    複数のボタンに対応させる

    コピーボタンをページ内に複数設置する場合、jQueryの記述を少しいじる必要があります。

    HTML

    copy_txtcopy_btnを、それぞれcopy_wrapで囲っておきましょう。

    <div class="copy_wrap">
    	<div class="copy_txt">三└(┐卍^o^)卍ドゥルルルルル</div>
    	<button type="button" class="copy_btn">Copy</button>
    </div>
    <div class="copy_wrap">
    	<div class="copy_txt">(((ꎤ’ω’)و三 ꎤ’ω’)-o≡シュッシュ</div>
    	<button type="button" class="copy_btn">Copy</button>
    </div>
    <div class="copy_wrap">
    	<div class="copy_txt">(☛(◜◔。◔◝)☚))</div>
    	<button type="button" class="copy_btn">Copy</button>
    </div>

    jQuery

    いじるのは3行目だけです。

    $(function() {
    	$('.copy_btn').on('click', function(){
    		let text = $(this).siblings('.copy_txt').text();
    		let textarea = $('<textarea></textarea>');
    		textarea.text(text);
    		$(this).append(textarea);
    		textarea.select();
    		document.execCommand('copy');
    		textarea.remove();
    		alert('「'+text+'」をコピーしました');
    	});
    });
    let text = $(this).siblings('.copy_txt').text();

    「クリックされたcopy_btnと同じ階層に存在するcopy_txt内のテキストを取得する」という記述に変更しました。

    実行結果

    今度こそ完成です。

    See the Pen jQueryClipboard - 2 by Leo_8192 (@Leo_8192) on CodePen.

    なんかもっとスマートな書き方がありそうですが、とりあえずこれでOKかな?実際に使用するなら、ボタンやアラート周りの装飾もしっかり整えたいですね。