在 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
};
完整的代码(onload
对隐藏的 div 进行闭包引用并 防止 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)