標準で組み込まれたclipboard.jsを使ってみた

説明

5.2の新機能「サイトヘルス情報」では、現状のサイト情報をクリップボードにコピーする機能がある。この機能の実装方法を調べてみると、clipboard.jsが利用されていた。

サイト情報のコピー機能

まずは「サイトヘルス情報」ページを開いて、サイト情報のコピー機能がどのように実装されているのか調べていく。この機能としては「サイト情報をクリップボードにコピー」ボタンがクリックされると、サイト情報がクリップボードにコピーせれる仕組みである。

サイト情報をクリップボードにコピーしたところ

このボタン部分をブラウザの開発者向け機能で確認すると、data-clipboard-text属性にサイト情報が丸ごと入っていることがわかる。

<button type="button" class="button copy-button" data-clipboard-text="`
### wp-core ###

version: 5.2
site_language: ja
user_language: ja

(省略)

`">
<span class="success" aria-hidden="true">コピーしました。</span>

これに対し、/wp-admin/js/site-health.jsを覗いてJavaScript側がどのようになっているかを確認。次は関連する部分を抜粋したものとなる。

var clipboard = new ClipboardJS( '.site-health-copy-buttons .copy-button' );

clipboard.on( 'success', function( e ) {
	var $wrapper = $( e.trigger ).closest( 'div' );
	$( '.success', $wrapper ).addClass( 'visible' );

	wp.a11y.speak( __( 'Site information has been added to your clipboard.' ) );
} );

ClipboardJSクラスのインスタンスを生成し、'success'イベントでspan要素に対して操作している。肝となるクリップボードに対してテキストをコピーする部分はまったく見えない仕様のようだ。続いて、ClipboardJSクラスが定義されているファイルを調べると、/wp-includes/js/clipboard.jsが見つかった。

このclipboard.jsは、/wp-includes/script-loader.phpにて次のように登録されている。

$scripts->add( 'clipboard', "/wp-includes/js/clipboard$suffix.js", array(), false, 1 );

(省略)

$scripts->add( 'site-health', "/wp-admin/js/site-health$suffix.js", array( 'clipboard', 'jquery', 'wp-util', 'wp-a11y', 'wp-i18n' ), false, 1 );

clipboard.jsのハンドル名は'clipboard'として、site-health.jsはこの'clipboard'に依存する指定でハンドル名'site-health'として登録されている。

実際に使ってみた

実際にプラグインで使う場合はまず wp_enqueue_script関数を使用する。

if ( wp_script_is( 'clipboard', 'registered' ) ) {
	wp_enqueue_script( 'clipboard' );
}

HTML側はクリップボードにコピーする内容が決まっている場合は次のような感じになる。クリック対象の要素は、サイトヘルス機能のようにbutton要素でもよいが、その他の要素でも問題はなく、ここではspan要素を使っている。

<span class="dashicons dashicons-clipboard" data-clipboard-text="コピーする内容をここに!"></span>

クリップボードにコピーした際に表示を変更するようなことをしないのであればコードは1行でよい。

const clipboard = new ClipboardJS( '.dashicons-clipboard' );

応用例

HTMLを出力する際にコピーする内容が決まっていない場合は、data-clipboard-text属性ではなく、data-clipboard-target属性を使用すればよい。

<textarea id="memo"></textarea>

<span class="dashicons dashicons-clipboard" data-clipboard-target="#memo"></span>

この例であれば、クリック時にtextarea#memoの入力内容がクリップボードにコピーすることができる。

以上のように、clipboard.js(ClipboardJSクラス)はシンプルなコーディングでクリップボードのコピー機能を実装できる。Zeno Rochaさん、ありがとう。


最終更新 : 2019年05月15日 12:59



お勧め

投稿記事でrubyタグを使えるようにする(前編)(2012年1月25日 更新)

rubyなどのルビ関連タグはIEの独自サポートから始まり、少し前のChrome/Safariが追随して利用できるようになっている。Firefoxはいまだにサポートしていないのだが、それなりに代替表示されるので、投稿記事で使えるようにしてみた。

WordPressの鼓動(2013年10月1日 更新)

WordPressでは、Ajaxを利用する方法の1つとして add_action関数を利用することができる。この方法を調べている過程で、'heartbeat'というおもしろそうなAjaxアクションがあったので、紹介しておく。

「順序」をtextからnumberに変更してみた(2018年5月27日 更新)

固定ページの編集画面の「投稿の属性」ウィジェットには、ページの並び替えに使用できる「順序」のinput要素がある。この「順序」のinput要素はtype属性が'text'となっており、編集の際にIMEが有効になってしまう場合がある。ページの編集頻度が多くなると、その都度IMEをオフにするのがやや面倒になってくる。

一定時間でログアウトする(2013年5月23日 更新)

ログイン関係を調べている関係で、 wp_set_auth_cookie関数に行き着く。ログイン画面の「ログイン状態を保持する」がチェックされた場合、クッキーの有効期限は14日間。チェックされていない場合は、ブラウザが閉じるまで常に有効となっているんだね。

5.3の機能強化:カスタムフィールドキーの条件指定が使いやすくなる(2019年11月19日 更新)

5.3 RC4もリリースされ、正式リリースまであと1週間。5.3の変更点を確認していると、WP_Meta_Queryクラスが変更されていた。これは「Expanded meta key comparison operators in 5.3」で紹介されており、さまざまな条件指定が追加されていた。