event オブジェクトの中身が false になる現象が発生。原因を調べてみた。

過去に一度ハマった時に切り分けができずに困ったことがありましたので共有です。

 

ある日突然kintoneのカスタマイズJSファイルが動かなくなる現象が起きました。

 

どうやらeventオブジェクト内のレコード情報の呼び出し時に「event.record.{フィールドコード}.value」を使用していた箇所で

>Cannot read property {フィールドコード} of undefined

のエラーが出ていたようです。

 

しかしコードには何の問題もないのになぜ・・・?と思っていたところ、

原因は他のJSファイルで同じイベントが発生したときにreturn false;を返したために起きたことが分かりました。

以下具体例。

 

例えば下記のsample1.js,sample2.jsを同じアプリに適用させ、sample1.jsを先に読み込んだ場合、

sample2.jsが読み込まれたときにはeventオブジェクトの中身がfalseに書き換わります。

 

■sample1.js

(function() {

    “use strict”;

    kintone.events.on(‘app.record.index.show’, function(event) {

          console.log(event) //eventのオブジェクトが普通に表示される

          return false;

    });

})();

 

■sample2.js

(function() {

    “use strict”;

    kintone.events.on(‘app.record.index.show’, function(event) {

          console.log(event) //falseが表示される!

          return event;

    });

})();

 

複数のJSファイルで同じイベントを扱うとたまに起きてしまう現象ですね・・・。プラグインと競合した場合も同様の現象が発生することがあります。

 

回避策としては

・正常系でreturn event;させる。

・何もリターンさせない(eventオブジェクトを書き換えない)。

・eventがfalse等になっている場合は処理をしないようにif(!event){ return false; }のような一文を特定のイベントでの処理時に入れておく

 

などが考えられますが、他にも何かいい案あればコメントお願いします。。

あすま様

そもそもかも知れませんが、return false とするのは削除イベントをキャンセルしたい時などに限られているはずです。

私の理解としては、 event の中身を編集したりして、その結果を return event で event に反映させるというのが大半のイベントの仕様だと思います。

従って、return false としてしまえば、 event が false になるのは当然のことのように思います。

一方で、return event をしないというのも、また別な弊害を生むことがあります。
(同じイベントハンドラが複数あるとき、1つでも return event していないものがあると、すべてのイベントで編集した event の内容が反映されないことがある、など)

kintoneのイベントは、一部の例外を除いて、 return event で終わるというのが基本だと私は認識しています。