这是一段可以追溯到Netscape Navigator时代的js代码。我无法弄清楚或找到这个人这样做的原因。
function id(i)
{
var e;
if (document.getElementById)
return document.getElementById(i);
else if (document.all)
return document.all[i];
else if (document.layers)
return document.layers[i];
return null;
}
在较新的浏览器中,if(document.getElementById)
始终是真的。看起来它正在检查是否存在该功能,但我不确定。
我问的原因是,这段代码会从浏览器IE8中读取不应具有name属性的{{1>}(不 name
)元素下面。我的任务是尝试让它在更新的浏览器上更有效地工作。但首先,我真的需要了解这段代码的含义。
从id
这样的属性中读取name
是在其他地方完成的,并且使用它作为自定义属性是一个非常简单的修复。我收录的这件作品涉及更多的作品,并不那么简单。
答案 0 :(得分:4)
这是getElementById
的一种特征检测形式 - 非常多:
function id(i)
{
var e;
if (document.getElementById) // the standard way
return document.getElementById(i);
else if (document.all) // old IE model, needed for very old IE versions
return document.all[i];
else if (document.layers) // old netscape model, Netscape 4 etc.
return document.layers[i];
return null;
}
除非你支持IE< 5.5或Netsape< 6,你们都不应该诚实地支持 - 你们今天应该避免这种形式的特征检测。
这种代码在今天很常见,以便执行特征检测。我想强调这样一个事实,即代码在编写时是最佳实践但今天没用。例如,今天你有类似的东西:
if ( !window.requestAnimationFrame ) {
window.requestAnimationFrame = ( function() {
return window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback,element) {
window.setTimeout( callback, 1000 / 60 );
};
} )();
}
执行完全相同的操作,仅适用于较新的API。