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

**URL:** <https://community.cybozu.dev/t/topic/9080>\
**Category:** kintone の構築／設計／運用\
**Created:** [2024 年 5 月 27 日午後 11:34 UTC](https://community.cybozu.dev/t/topic/9080 "2024-05-27T23:34:27Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![sawara](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@sawara](https://community.cybozu.dev/u/sawara)\
**Post date:** [2024 年 5 月 27 日午後 11:34 UTC](https://community.cybozu.dev/t/topic/9080/1 "2024-05-27T23:34:27Z")

</div>

# 前提条件

- 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を読み込んでいます。

```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側に、こちらの機能を持たせたく考えておりますが、そもそも実装が可能なのかをご教授いただきたいです。

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

---

<div class="post-metadata">

**Author:** ![mura](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/mura/32/41_2.png) [@mura](https://community.cybozu.dev/u/mura)\
**Post date:** [2024 年 5 月 27 日午後 11:38 UTC](https://community.cybozu.dev/t/topic/9080/2 "2024-05-27T23:38:10Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![sawara](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@sawara](https://community.cybozu.dev/u/sawara)\
**Post date:** [2024 年 5 月 28 日午前 12:00 UTC](https://community.cybozu.dev/t/topic/9080/3 "2024-05-28T00:00:32Z")

</div>

mura 様

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

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

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

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

---

<div class="post-metadata">

**Author:** ![aaa](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/aaa/32/277_2.png) [@aaa](https://community.cybozu.dev/u/aaa)\
**Post date:** [2024 年 5 月 28 日午前 5:37 UTC](https://community.cybozu.dev/t/topic/9080/4 "2024-05-28T05:37:44Z")

</div>

> [@sawara](#):
>
> ‘app.record.index.edit.show’と’app.record.create.show’, 'app.record.edit.show’はイベントハンドラーに登録されるタイミングが異なるのでしょうか？

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

> **[イベントハンドラー登録の適切なタイミングについて](https://cybozu.dev/ja/kintone/tips/development/customize/development-know-how/right-timing-of-kintone-event-handling/)**
>
> kintoneの画面表示時に発生するイベントハンドラーの適切な登録タイミングを解説します。

> イベントハンドラーの登録よりもイベントが先に発生した場合、イベントハンドラーは呼び出されません。  
> そのため、DOMContentLoadedやloadイベント内で、kintoneにイベントハンドラーを登録している場合、イベントハンドラーを呼び出しできないことがあります。
> 
> 具体的には、次のイベントが該当します。
> 
> - app.record.create.show
> - app.record.edit.show
> - app.record.detail.show

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

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

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

---

<div class="post-metadata">

**Author:** ![sawara](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@sawara](https://community.cybozu.dev/u/sawara)\
**Post date:** [2024 年 5 月 28 日午前 7:24 UTC](https://community.cybozu.dev/t/topic/9080/5 "2024-05-28T07:24:07Z")

</div>

aaa 様

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

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

```javascript
(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);
  });
})();

```

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

---

<div class="post-metadata">

**Author:** ![aaa](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/aaa/32/277_2.png) [@aaa](https://community.cybozu.dev/u/aaa)\
**Post date:** [2024 年 5 月 28 日午前 9:08 UTC](https://community.cybozu.dev/t/topic/9080/6 "2024-05-28T09:08:36Z")

</div>

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

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

```javascript
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

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

```

とありました。

```javascript
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が読み込まれているかのフラグ

---

<div class="post-metadata">

**Author:** ![sawara](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@sawara](https://community.cybozu.dev/u/sawara)\
**Post date:** [2024 年 5 月 28 日午前 11:48 UTC](https://community.cybozu.dev/t/topic/9080/7 "2024-05-28T11:48:58Z")

</div>

aaa様

なるほどです。

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

 ![image](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/2X/b/be5560990036b308d18774af598cdd838a76b831.png)

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

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

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

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2024 年 5 月 31 日午前 11:49 UTC](https://community.cybozu.dev/t/topic/9080/8 "2024-05-31T11:49:50Z")

</div>

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