extimer.hta // コメント
前回の記事で公開した、時限式コマンド実行アプリ extimer.hta のソースコードについて、コメントを記していく。
<meta http-equiv="X-UA-Compatible" content="IE=9" />
この meta 要素により、mshta.exe の動作モードを IE9 にする。IE10 モードでは、後述の hta:application 要素が動作しないからだ。
<hta:application id="hta" applicationname="ExecTimer" border="thick" borderstyle="normal" caption="yes" contextmenu="no" icon="" innerborder="yes" maximizebutton="no" minimizebutton="yes" navigable="no" scroll="no" scrollflat="no" selection="yes" showintaskbar="yes" singleinstance="no" sysmenu="yes" version="1.0" windowstate="normal" />
hta:application 要素は、HTA でのみ効果を発揮する。これを記述すると、ウィンドウのタイトルバーを非表示にしたり、テキスト選択を無効にしたりすることができる。そして、JavaScript から、このノード特有のプロパティ commandLine にアクセスし、コマンドライン引数を取得することができる。たくさんの属性を記述しているが、覚書としての用途が主であり、ほぼすべて省略可能である。
<title>ExecTimer</title>
title 要素には文字列を入れているが、動作モードが IE9 だと、なぜかタイトルバーに反映されない。IE5,6,7,8,10 では反映されるのを確認した。
<p>残り時間: <time id="clock">?</time></p>
残り時間を表示する要素として、HTML5 で導入された time 要素を使用している。
var args = hta.commandLine.match(/(^"[^"]+") ?(\d*) ?([\S\s]*)/);
hta.commandLine で、コマンドライン引数を取得している。この hta とは、hta:application 要素の属性 id="hta"
のそれである。
var execCmd = function(cmd) { new ActiveXObject("WScript.Shell").exec(cmd); setTimeout(function() { window.close(); }, 100); };
WSH の exec 関数で、コマンドやファイル名を実行する。のち、window.close
で extimer.hta を終了するが、100 ミリ秒の待機を経てから行っている。終了するのが早すぎると、exec によって起動したソフトのウィンドウにフォーカスが移らないからだ。
var clockText = document.querySelector("#clock").firstChild;
IE9 にもなると、DOM ノードへの参照を CSS セレクタによって取得できる関数 document.querySelector が使用できる。IE8 から飛躍的に Web 標準度が向上している。
window.resizeTo(320, 31 + document.body.offsetHeight);
コンテンツ表示領域の縦幅が、body 要素の高さと同じになるように、ウィンドウをリサイズしている。31
というマジックナンバーは、タイトルバーやウィンドウ枠のだいたいの合計値である。
cancelbtn.addEventListener("click", function() { window.close(); }); addEventListener("keyup", function(e) { if (e.key === "Enter" || e.key === "Esc") { cancelbtn.click(); } }); cancelbtn.focus();
IE9 にもなると、DOM イベントハンドラ登録関数として、IE 独自の attachEvent だけでなく、addEventListener も実装されている。
キャンセルボタンを押すと、タイマーは中断され、extimer.hta が終了するようにしてある。Enter や Esc を押しても同じことだ。
extimer.hta 起動時に、キャンセルボタンにフォーカスを移している。このことにより、Spacebar を押すことによってもキャンセルが可能となっている。