kintoneプラグインの「kintone.events.onによるapp.record.edit.show」のイベントハンドラーについて

前提条件

  • desktop.jsでの対象のフィールドを編集不可にする処理でwarningが発生している

  • プラグインのjsおよびcssなどはエッジロケーションでCDNとして配信されており非同期で実行される

  • ‘app.record.create.show’, 'app.record.edit.show’のみで発生する事象(同様の処理が’app.record.index.edit.show’では発生しない)

概要

「show.js:283 kintone.events.onによるapp.record.edit.showの登録は、同期的に行ってください。非同期に登録すると、イベントハンドラーが実行されない場合があります。」というwarningを解消したいです。

構成としては前提条件にあるようにCDN化したJavaScriptを読み込んでいます。

   kintone.events.on(['app.record.create.show', 'app.record.edit.show'], (event) => {
    const record = event.record;
    if (targetFieldCode && record[targetFieldCode]) {
      record[targetFieldCode].disabled = true;
    }
    return event;
  });

同じ処理を’app.record.index.edit.show’で行ってもwarningは発生しません。またCDNではなくプラグインとしてzipで固める側に処理を持たせるとwarningは発生しません。

質問

‘app.record.index.edit.show’と’app.record.create.show’, 'app.record.edit.show’はイベントハンドラーに登録されるタイミングが異なるのでしょうか?

可能であればCDN側に、こちらの機能を持たせたく考えておりますが、そもそも実装が可能なのかをご教授いただきたいです。

説明が不足している箇所もあるかも知れませんが、どうぞ、よろしくお願いいたします。

return event してないように見受けられますが、そのせいでなにかおこってるとかありませんかね。。。?

mura 様

ご回答およびご指摘ありがとうございます。

すみません。添付したコードが間違っていました。

編集し「return event」を追加いたしました。

この状態で、相談内容にある、warningが表示されます。

イベントハンドラー登録の適切なタイミングについて - cybozu developer network

イベントハンドラーの登録よりもイベントが先に発生した場合、イベントハンドラーは呼び出されません。
そのため、DOMContentLoadedやloadイベント内で、kintoneにイベントハンドラーを登録している場合、イベントハンドラーを呼び出しできないことがあります。

具体的には、次のイベントが該当します。

  • app.record.create.show
  • app.record.edit.show
  • app.record.detail.show

とありますので、別のようです。

おそらくmanifest.jsonで外部に置いてあるJavaScriptファイルを参照しようとすると発生するのでしょう。

思いつきですが、どうしてもプラグインにJavaScriptの中身を置きたくない場合は、イベントハンドラーの箇所は、ZIPにいれて、実装を関数に書き出して外部URLに置くとか(結局同じかも)

1 Like

aaa 様

ご回答いただきありがとうございます。

例えば、以下のような形ということでしょうか?

(function() {
  'use strict';
  
  // 外部のJavaScriptファイルを動的に読み込む
  function loadExternalScript(url, callback) {
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    script.onload = callback;
    document.head.appendChild(script);
  }

  // 外部スクリプトがロードされた後にイベントハンドラーを登録
  loadExternalScript('https://my-cdn-path/handler.js', function() {
    kintone.events.on(['app.record.create.show', 'app.record.edit.show'], handleEvent);
  });
})();

なるほど、参考になりました。試してみたいと思います!

コードの詳細は、全くわかりません。

警告を表示しているのが show.jsの283行目ということで見てみました。

Array.isArray(a) ? t(a, function(c) { cy(c, b) }) :
(Ua(dy, a) && N.CUSTOMIZE_JS_LOADED && window.console.warn(M("kintone.events.on.warning", a, vj())),

message-JP_ja.js

  "kintone.events.on.warning": "kintone.events.onによる{0}の登録は、同期的に行ってください。非同期に登録すると、イベントハンドラーが実行されない場合があります。(略)

とありました。

Ua(dy, a) && N.CUSTOMIZE_JS_LOADED 

の2つがtrueにならなければ、警告は抑止できるようです。(各変数の内容などはまちがっているかもしれません。)

  • Ua(dy, a)は、イベントaが、特定のイベントdy[ app.record.create.show,
    ,app.record.edit.show, app.record.detail.show]にふくまれるか?
  • カスタマイズのJavaScriptが読み込まれているかのフラグ
1 Like

aaa様

なるほどです。

こういう風になっているんですね。

すみません。自分で調べればよかったですね。

時間がある際に検証してみたいと思います。

ご回答いただきありがとうございました!

1 Like

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。