IEではhtmlのid属性がwindowのプロパティになる

JavaScriptでは、varによる変数宣言をしていない場合、グローバルオブジェクト(window)のプロパティとして扱われる。
IEでは、htmlのid属性が、このグローバルオブジェクトのプロパティになってしまうらしい。

以下のコードで、「click!」というアラートが出たら、 window.btn01 に button の DomElement が入っているということになる。(Firefox や Chrome 等では、エラーになってなにも表示されないはず)

<button id="btn01" onclick="alert(btn01.innerHTML);">click!</button>

しかも jQuery が有効な状態で、

btn01 = null;

などとやろうとすると、btn01 変数にはすでに button の DOM が入っているのと、IE8とjQueryの相性の問題で、IEではエラーになってしまう。

まぁ、

var btn01 = null;

と、var つけてやるだけでOKだし、そもそもIE9ではエラーにならないので、古いブラウザ使うなってコトでFAでもよい気がしないでもないけどね…
とはいえ、9/1現在、IE8がシェア35%と圧倒的なので無視できないのよねぇ
参考: 日本のバージョン別ブラウザシェアグラフ (StatCounter Global Statsより)

WordPress Theme Designer のテーマのバグ

今現在のこのブログは、Techy boxのフリー版を少し改造して使っている。
(…と言っても、サイドバーを左に移動しているだけだが)

トップページ

何が気に入ったかって、ページの頭にFeaturedが画像付きでどんどんスライドしていくところ。
…ところが、なんか1週目のループの調子がおかしい。
どうもバグがあるようだ。

続きを読む

VBA / VBS で正規表現による関数を使った置き換え

JScriptのString.replaceメソッドは非常に便利だ。
置き換え文字列に、「文字列」ではなく「関数」が使えるところが意外と使える。

"test0 test1".replace(
    /\w+(\d)/g,
    function($0,$1){return (Number($1)+1).toString();})

てな具合に。

普段はWSHではVBSなんぞ使ったりしないが、
たまにどうしてもVBAやVBSを使わなくてはならない場合がある。
そんなときにそれっぽい動作をする様なのを、
不完全ながら自作してみた。

続きを読む

WSHで強制的にcscriptで起動させつつエラーは出す

JScriptで、ダブルクリックしたときにコマンドプロンプトで強制的に起動するとき
こんな感じで起動してやると、
Echoがたくさんあっても大変なことにならず、
しかもエラーコードもしっかり返すことができる。

function CRun(){
    if (!(/CSCRIPT\.EXE/i).test(WScript.FullName)){
        var WshShell = new ActiveXObject("WScript.Shell");
        var strParam = "";
        for (var i = 0; i < WScript.Arguments.Count(); i++){
            strParam += " \"" + WScript.Arguments(i).replace("\"", "\"\"") + "\"";
        }
        WScript.Quit(WshShell.Run("cmd.exe /v:on /s /c \"cscript.exe //nologo \""
            + WScript.ScriptFullName + "\"" 
            + strParam + " & pause & exit /b !ERRORLEVEL!\"", 8, true));
    }
}
CRun();
WScript.Echo("CScript!");
WScript.Quit(8);

環境変数の遅延展開をつかって、ERRORLEVELを戻しているのがミソ。
これで、エラーが起きたときの処理もできる。
私は業務を軽減するツールとか作るときに割とよく使う。