dhtmlXWindowsのonCloseイベントはboolean型の戻り値が必要です

dhtmlXWindowsではWindowの右上部に閉じるボタン(close)があります。このボタンをクリックすると、onCloseイベントが発火します。

onClose DHTMLX Docs

ところが、このイベントをハンドリングした場合、上記ドキュメント通りイベントハンドラを設定してもWindowが閉じません。

どうにもこうにもよくわからなかったので、サンプルを確認してみたところ以下の通りとなっていました。

var dhxWins, w1, w2, w3;
function doOnLoad() {
  dhxWins = new dhtmlXWindows();
  dhxWins.attachViewportTo("winVP");
  
  w1 = dhxWins.createWindow("w1", 20, 30, 320, 200);
  w1.setText("dhtmlxWindow #1");
  
  w2 = dhxWins.createWindow("w2", 50, 70, 320, 200);
  w2.setText("dhtmlxWindow #2");
  
  w3 = dhxWins.createWindow("w3", 80, 110, 320, 200);
  w3.setText("dhtmlxWindow #3");
  
  // personal event
  w1.attachEvent("onClose", function(win){
    writeLog("personal event onClose called for "+win.getText());
    return false;                  // <===ここ
  });
  
  // global events
  dhxWins.attachEvent("onClose", function(win){
    writeLog("global event onClose was called for "+win.getText());
    return false;                  // <===ここ
  });
  
}
function writeLog(text) {
  document.getElementById("logsHere").innerHTML += "<br>"+text;
  document.getElementById("logsHere").scrollTop = document.getElementById("logsHere").scrollHeight;
}
function doOnUnload() {
  if (dhxWins != null && dhxWins.unload != null) {
    dhxWins.unload();
    dhxWins = w1 = w2 = w3 = null;
  }
}

うーん良くあることなのですが、なぜか戻り値をboolean型で返却しています。しかも、サンプルではonCloseイベントを実行しても画面が閉じないようになっています。

ということで、onCloseイベントでtrueを返却するように変更してみると画面が閉じることが確認できます。つまり、閉じる場合はtrueを指定し、閉じない場合はfalseを指定することになります。

DHTMLXには良くあることなのですが、ドキュメントとサンプルが乖離していることがあります。特に、戻り値に関してはvoidであってもbooleanを指定すると挙動が変わることもあります。この辺はサンプルを注意して読んだりフォーラムを検索すると意外と出てきます。

以上、ご参考まで。

パーフェクトJavaScript

パーフェクトJavaScript