JavaScriptでwebページのURLをクリップボードにコピーするボタンを設置

WebサイトやブログでのWebページのシェアはSNS等のボタンを設置することが多いですが、それだけでなく現在観覧しているページのURLを簡単にコピーできるボタンがあるととても便利です。

SNSだけでなくWebメールやFacebookのメッセンジャー、その他いろいろなアプリケーションでのやり取りでURLを簡単に貼り付けたいこともあるでしょう。
もちろん、パソコンですとマウス操作やスマートフォンでもコピー操作はありますが、もっと簡単にボタン1つクリックするアクションだけでクリップボードにコピーして共有したいところです。

そちらのほうがWebを観覧するユーザーにとっても楽だし都合がいいですよね。
親切にボタンを設置してあげましょう。

ここではjQueryやプラグインを使わず、JavaScriptで観覧しているwebページのURLをクリップボードにコピーするボタンを設置する方法をご紹介します。

PCでもスマートフォンでもどちらでもしっかり動くコピー機能のボタンを作成していきます。


ページのURLをコピーするボタンの作成


まずはコピーボタンをHTMLタグで構築していきます。

HTML

<button type="button" id="copy-page"><span id="cAction">URLをコピー</span></button>


aタグなどでreturn false;でリンクを無効にしておいてボタンとして、onclickイベントハンドラでJavaScriptのイベントを発動させてもいいですが、スマートフォンでHTMLタグのonclick属性の挙動がおかしくしっかり作動しないことがあるので、今回はbuttonタグで作成していきます。

CSSでデザインするためにクラス名「copy-btn」を付けておきます。
クリックした後にコピーが完了したことを伝えるため、spanタグのid「cAction」の要素のテキストが変更できるように準備しておきます。


続いてCSSになります。
サンプルとしては以下のようにスタイルを効かせます。

ボタンのスタイルはご自身のWebサイトやブログに合わせてください。

CSS

#copy-page {
  display: inline-block;
  width: 160px;
  padding: 8px 0;
  font-size: 1rem;
  text-align: center;
  color: #666;
  border-radius: 6px;
  background: #c7c7c7;
  outline: none;
  -webkit-transition: all 0.5s ease;
  -moz-transition: all 0.5s ease;
  -o-transition: all 0.5s ease;
  transition: all 0.5s ease;
}

#copy-page:hover {
  cursor: pointer;
  opacity: .7;
}


コピーボタンが構築できましたら、クリップボードへのコピー処理のプログラムをJavaScriptで実装していきます。


JavaScriptでイベント処理


クリップボードへのコピーはdocumentオブジェクトのexecCommandメソッドを利用します。
「document.execCommand(‘copy’)」と引数を「Copy」とすることでコピーできます。
またexecCommandメソッドのコピーは選択された内容をコピーするため、createRange();などを利用して選択するような処理もしていきます。

それでは見ていきましょう。


まずはdocument.getElementByIdで対象のボタンのidをセット。
そしてボタンがクリックしたときにイベントが発生するようonclickイベントでの関数を定義します。

JavaScript

<script>
document.getElementById("copy-page").onclick = function() {
  $(document.body).append("<textarea id=\"copyTarget\" style=\"position:absolute; left:-9999px; top:0px;\" readonly=\"readonly\">" +location.href+ "</textarea>");
  let obj = document.getElementById("copyTarget");
  let range = document.createRange();
  range.selectNode(obj);
  window.getSelection().addRange(range);
  document.execCommand('copy');
  document.getElementById("cAction").innerHTML = "コピーしました";
};
</script>


関数の処理の内容としては、
始めにbodyタグ直下にappendメソッドで要素を追加します。
追加する要素は、location.hrefで現在開いているWebページのURLを内容を入れたtextareaになります。今回のクリップボードへのコピーはinputやtextareaなどのテキストが入力できる要素からテキストをコピーするという仕様なので、appendメソッドを使って要素を追加する必要があります。

そのあとに変数「obj」に追加した要素を格納して、変数の中身のtextareaの内容を選択します。
selectメソッド「select()」を利用するやり方もありますが、スマートフォンではselectメソッドでうまく選択されないためクリップボードにコピーできません。そこでRange(範囲)をセットして選択できるように「document.createRange();」を利用していきます。

変数「range」にdocument.createRange();で範囲のコンテナを用意しておいて、テキストノードをselectNodeメソッドで「range.selectNode(obj);」のようにobjを入れます。これでコンテナにtextareaのテキストが範囲としてセットされます。
window.getSelection関数で選択範囲をSelectionオブジェクトとしてを取得、addRangeメソッドを利用して「.addRange(range)」のようにRangeオブジェクトをSelectionに選択範囲として追加します。
これでスマートフォンでもうまく選択することができます。

そして選択したtextareaの中のWebページのURLを「document.execCommand(‘copy’);」でコピーします。
ここまででクリップボードへのコピーが完了となります。

最後はコピーが完了したことがわかるようにボタンのテキストを「コピーしました」に変更します。


まとめ


このブログでもJavaScriptで実装したURLがコピーできるボタンを設置しています。あとはちょっとアイコンも付けちゃってコピーボタンとわかりやすいデザインにしています。

人気のSNSのシェアボタンだけでもいいですが、現在観覧しているページのURLのコピーを簡単にできるようにしたほうが臨機応変に対応できるので、一緒にボタンを設置しておいた方が良いのではないでしょうか。

今回ご紹介した方法はPCでもスマートフォンでもどちらでも動く仕様となっていますので是非、親切に自分のデザインでコピーボタンを設置してみてください。