組み込みJSのイベントハンドラ


イベントハンドラを設定する事で、ある特定のJavaScriptのイベント(クリックイベントなど)が発生した時に処理を挟み込めます。a-blog cmsでは組み込みJSが実行したイベントの後に処理を実行できるようにするため、いくつかのイベントハンドラを用意しています。

a-blog cms が用意しているイベントは ACMS.addListener を利用することでイベントに対してリスナーを登録することができます。

Ver. 3.2.29 以降は、新しいイベントの仕組み ACMS.events が使えます。ACMS.addListener と ACMS.dispatchEvent について、これまでのコードはそのまま動作し、既存のイベントも引き続き発火します。新しく書くコードでは ACMS.events を使うことをおすすめします。

ACMS.events は、イベントが発火した後に登録したリスナーには、過去の発火を届けません(ACMS.addListener は届けます)。そのため、起動時のイベント(acmsReady・acmsAdminReady)は ACMS.events.on ではなく、ACMS.ready()・ACMS.adminReady() を使ってください。

ACMS.addListener('eventName', function (event) {
  console.log(event);
});

また、event オブジェクト の detail プロパティにアクセスすることでイベント独自のカスタムデータを参照することができます。

ACMS.addListener('eventName', function (event) {
  console.log(event.detail); // or console.log(event.obj)
});

今のイベント

Ver. 3.2.29 以降の書き方

受け取る値

acmsReady

ACMS.ready(fn)(従来の ACMS.Ready(fn) も使えます)

なし

acmsAdminReady

ACMS.adminReady(fn)

なし

acmsDispatch

ACMS.events.on('acms.dispatch.after', fn)

なし

acmsAddUnit

置き換えなし(引き続き ACMS.addListener('acmsAddUnit', ...) を使います。非推奨にはしていません)

e.target にユニットの DOM

acmsAfterPostInclude

置き換えなし(引き続き ACMS.addListener('acmsAfterPostInclude', ...) を使います)

e.detail.include

acmsAddCustomFieldGroup

ACMS.events.on('field-group.add.after', fn)

{ element }

acmsDialogOpened

ACMS.events.on('dialog.open.after', fn)

{ element }

acmsAdminSelectTab

ACMS.events.on('tab.select.change', fn)

{ tab }

acmsValidateFailed

ACMS.events.on('validator.submit-fail.after', fn)

{ results, form }

acmsFormInvalid

ACMS.events.on('validator.invalid.after', fn)

{ results, element }

acmsFormValid

ACMS.events.on('validator.valid.after', fn)

{ results, element }

acmsFormValidated

ACMS.events.on('validator.validated.after', fn)

{ results, element }

acmsAdminDelayedContents

ACMS.events.on('admin.delayed-contents.change', fn)

{ target, detail }

acmsLazyLoaded

ACMS.events.on('lazy-load.load.after', fn)

{ element }

// acmsReady(Ver. 3.2.29 以降)
ACMS.ready(() => {
  ACMS.Config.postIncludeEffect = 'fade';
});

// acmsAdminReady(Ver. 3.2.29 以降)
ACMS.adminReady(() => {
  // 管理画面の初期化後に行う処理
});

// acmsDispatch(Ver. 3.2.29 以降)
ACMS.events.on('acms.dispatch.after', () => {
  $('[href*=bxslider]').remove();
});

// acmsAddCustomFieldGroup(Ver. 3.2.29 以降)
ACMS.events.on('field-group.add.after', ({ element }) => {
  console.log(element); // カスタムフィールドグループの DOM
});

// acmsValidateFailed(Ver. 3.2.29 以降)
ACMS.events.on('validator.submit-fail.after', ({ results, form }) => {
  console.log(results); // バリデーション結果
});

// acmsFormInvalid / acmsFormValid / acmsFormValidated も同じ形
ACMS.events.on('validator.valid.after', ({ results, element }) => {
  console.log(results);
});

ACMS.events.on は、リスナーの登録を解除するための関数を返します。

acms.dispatch.after は、ACMS.Dispatch() が実行されるたびに(ダイアログやインライン編集で動的にコンテンツが追加される都度)発火します。


このページで説明しているイベントハンドラの書き方は変わりません。既存のテーマを書き換える必要はありません。

管理画面の操作(保存・削除・アップロードなど)に処理を割り込ませたい場合は、管理画面の JavaScript 拡張(実験的機能)を参照してください。処理の中止・送信内容の書き換え・非同期処理の待機ができます。

acmsReady

組み込みJSの実行が出来る段階で発火するイベント。js/config.js などをカスタマイズする時は、このイベントが発火してから設定を行う。またよく使うイベントなのでエイリアスが用意されている ACMS.Ready(function() {});

ACMS.Ready(function() {
  ACMS.Config.postIncludeEffect = 'fade';
});

// 以下でも同じです。
ACMS.addListener('acmsReady', function() {
  ACMS.Config.postIncludeEffect = 'fade';
});

acmsAdminReady

管理画面用の組み込みJSが実行出来る段階で発火するイベント。

ACMS.addListener("acmsAdminReady", function() {
});

acmsDispatch

組み込みJSのディスパッチ処理が終わった時のイベントハンドラ。正確には、ACMS.Dispatch()の処理が終わった後に実行される処理を記述できます。以下の例では、組み込みJSの処理が終わった段階で、bxsliderのCSSを読み込んでいるlinkタグを削除しています。

ACMS.addListener("acmsDispatch", function() {
    $("[href*=bxslider]").remove();
});

acmsAddUnit

エントリーの編集画面にてユニットが追加された時のイベントハンドラ。カスタムユニットでJavaScriptを利用したい場合などに利用します。

ACMS.addListener("acmsAddUnit", function(e) {
   console.log(e.target); // ユニットの dom が入っています。
});

acmsAfterPostInclude

PostIncludeで動的にHTMLが読み込まれた後に実行されるイベントハンドラ。webフォントや、配置を揃えるJSなどの利用が考えられます。

ACMS.addListener("acmsAfterPostInclude",function(){
   //ここに処理が入ります。
});

acmsAddCustomFieldGroup

カスタムフィールドグループで項目が追加された時のイベントハンドラ。 以下の例では、カスタムフィールドグループで項目が追加された時、その項目に対して、DatepickerのJSが動くようにしています。

ACMS.addListener("acmsAddCustomFieldGroup",function(e) {
    console.log(e.target); // カスタムフィールドグループの dom が入っています。
});

acmsDialogOpened

モジュールID編集用ダイアログや、ブログ編集用ダイアログなどのダイアログウィンドウが表示されるタイミングで発火するイベントです。

ACMS.addListener("acmsDialogOpened", function() {

});

acmsAdminSelectTab

管理画面で使われているタブパネルが切り替わったタイミングで発火するイベントです。

ACMS.addListener("acmsAdminSelectTab", function() {

});

acmsValidateFailed

フォームのsubmitボタンを押した時に組み込みJSによるバリデーションに失敗したタイミングで発生するイベントです。

ACMS.addListener("acmsValidateFailed", function(event) {
  console.log(event.detail.results); // バリデーション結果を取得できます。
});

acmsFormInvalid

「組み込みJSによるバリデーション」に失敗したタイミングで発生するイベントです。

ACMS.addListener("acmsFormInvalid", function(event) {
  console.log(event.detail.results); // バリデーション結果を取得できます。
});

acmsFormValid

「組み込みJSによるバリデーション」に成功したタイミングで発生するイベントです。

ACMS.addListener("acmsFormValid", function(event) {
  console.log(event.detail.results); // バリデーション結果を取得できます。
});

acmsFormValidated

「組み込みJSによるバリデーション」によるバリデーションが行われたタイミングで発生するイベントです。

ACMS.addListener("acmsFormValidated", function(event) {
  console.log(event.detail.results); // バリデーション結果を取得できます。
});

acmsAdminDelayedContents

ダイアログや、タブなど後から表示されるコンテンツが表示されるタイミングで発火するイベントです。

ACMS.addListener("acmsAdminDelayedContents", function() {

});

acmsLazyLoaded

組み込みJSの 「遅延読み込み」により要素の遅延読み込みが完了したタイミングで発火するイベントです。

ACMS.addListener("acmsLazyLoaded", function() {

});

オリジナルのイベントハンドラを用意する

また、独自にイベントハンドラを用意することも可能です。以下のように、ACMS.dispatchEventでイベントを発行します。

//イベントの発行
ACMS.dispatchEvent("イベントハンドラ名");
ACMS.dispatchEvent("イベントハンドラ名", dom, detail, options);
  • 第1引数(必須): イベントハンドラ名
  • 第2引数(オプション): リスナーでイベントが発行されたdomを取得できます。
  • 第3引数(オプション): 任意のオブジェクトをリスナーで取得できます。
//ハンドラの実行
ACMS.addListener("イベントハンドラ名", function(event) {
    // dispatchEventで渡した dom が取得できます。指定していない場合は、window.document が入っています。
    console.log(event.target); 
    
    // dispatchEventで渡した detail が取得できます。
    console.log(event.detail); // or console.log(event.obj);
});

Ver. 3.2.29 以降は、ACMS.events.notify でイベントを発行し、ACMS.events.on で受け取れます。イベント名は他と重ならないよう プラグイン名.動作.after のように付けてください。

// イベントの発行
ACMS.events.notify('my-plugin.something.after', { id: 1 });

// ハンドラの実行
const unsubscribe = ACMS.events.on('my-plugin.something.after', (payload) => {
  console.log(payload.id);
});

// 受け取りをやめるとき
unsubscribe();

管理画面向けのイベント(実験的機能)

Ver. 3.2.29 から、管理画面の操作に割り込むための新しいイベントの仕組み(ACMS.events)が加わりました。この機能は、Ver. 3.2 の間は実験的機能として提供し、Ver. 3.3 で正式に提供する予定です。従来のイベントと同時に発火するため、既存の購読はそのまま動作します。

新しい仕組みでは、次のことができます。

  • 操作の中止(確認ダイアログを出して、キャンセルされたら保存しない)
  • 送信内容の書き換え
  • 非同期処理の待機(外部 API に問い合わせてから続行する)

従来のイベントとの対応表は イベント一覧 にあります。

ACMS.addListener について

ACMS.addListener は今後も動作します(撤廃しません)。新しく書く場合は ACMS.events.on を使ってください。詳細は イベント(ACMS.events) を参照してください。