这个遗留代码的含义是什么?

时间:2014-03-25 15:15:05

标签: javascript legacy

这是一段可以追溯到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是在其他地方完成的,并且使用它作为自定义属性是一个非常简单的修复。我收录的这件作品涉及更多的作品,并不那么简单。

1 个答案:

答案 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。