sawara
(sawara)
1
前提条件
-
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側に、こちらの機能を持たせたく考えておりますが、そもそも実装が可能なのかをご教授いただきたいです。
説明が不足している箇所もあるかも知れませんが、どうぞ、よろしくお願いいたします。
mura
2
return event
してないように見受けられますが、そのせいでなにかおこってるとかありませんかね。。。?
sawara
(sawara)
3
mura 様
ご回答およびご指摘ありがとうございます。
すみません。添付したコードが間違っていました。
編集し「return event」を追加いたしました。
この状態で、相談内容にある、warningが表示されます。
aaa
4
イベントハンドラー登録の適切なタイミングについて - 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
sawara
(sawara)
5
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);
});
})();
なるほど、参考になりました。試してみたいと思います!
aaa
6
コードの詳細は、全くわかりません。
警告を表示しているのが 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
system
(system)
クローズされました:
8
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。