IE<9 で変更イベントを委譲するのは面倒です。この質問をチェックして、それがどのように行われたかを確認することは可能ですが、エレガントとは言えません。
しかし、あなたのコードはイベントをデリゲートしていないので、イベントにハンドラーを直接アタッチするだけでonload
うまくいくはずです (そして、X ブラウザーと互換性があります)。
document.getElementById('test').onchange = function(e)
{
e = e || window.event;//the only IE headache
var shown = this.options[this.selectedIndex].value == 1;
document.getElementById('hidden_div').style.display = shown ? 'block' : 'none';
//^^ could keep a reference to this in a closure
};
完全なコード (非表示のdivへonload
のクロージャ参照とie でのメモリ リークの防止) は次のようになります。
var winLoad = function(e)
{
var hiddenDiv = document.getElementById('hidden_div');
document.getElementById('test').onchange = function(e)
{
var shown = !!(this.option[this.selectedIndex].value == 1);//to be safe, coerce to bool
hiddenDiv.style.display = shown ? 'block' : 'none';
};
if (window.addEventListener)
{
return window.removeEventListener('load',winLoad,false);
}
return window.detachEvent('onload',winLoad);
};
if (window.addEventListener)
{
window.addEventListener('load',winLoad,false);
}
else
{
window.attachEvent('onload',winLoad);
}
これは、IE7 (おそらく IE6 も) を含め、すべての主要なブラウザーで正常に動作するはずです。