这是一段可追溯到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
(not id
)不应具有name属性的元素。我的任务是设法使其在新型浏览器上更有效地工作。但是首先,我真的需要了解这段代码的含义。
name
从诸如at属性的读取<tr>
是在其他地方完成的,这是将其用作自定义属性的非常简单的修复。我包括的这部分内容涉及更多的内容,而且不那么直接。
这是一种功能检测的形式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执行完全相同的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句