【问题标题】:What is the meaning of this legacy code?这个遗留代码的含义是什么?
【发布时间】:2014-03-25 15:15:05
【问题描述】:

这是一段可以追溯到 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 属性的元素的 namenot id)。我的任务是尝试让它在较新的浏览器上更有效地工作。但首先,我真的需要了解这段代码的含义。

<tr> 等属性读取name 是在其他地方完成的,这是一个非常简单的修复,将其用作自定义属性。我包含的这一部分涉及更多部分,并不那么简单。

【问题讨论】:

  • “看起来它正在检查该功能是否存在,但我不太确定。” Bingo
  • 距离我上次使用 JavaScript 已经过去了大约 5 年,但是是的,我记得在使用旧版浏览器时遇到了问题,并且 document.getElementById。我认为他只是试图让它在旧版浏览器上运行。
  • 有人解释了 document.all 在这里 - stackoverflow.com/questions/2408424/…
  • 覆盖netscape navigator等getElementById方式。不同的浏览器用来实现这个对象的方式不同。我认为这不再相关,getElementById 应该可以正常工作。
  • 正如 Axel 所说,这是一张支票。 JavaScript 支持因浏览器而异。这意味着用户在继续使用代码之前必须进行大量检查。基本上,该代码检查是否支持getElementById() 选择器。如果未找到,则检查是否支持 document.all。最后它检查对document.layers 的支持。这可以追溯到第一个 JavaScript 库出现之前。这样的回忆。

标签: javascript legacy


【解决方案1】:

这是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

这种代码在今天很常见,用于执行特征检测。我想强调一个事实,即该代码在编写时是最佳实践,但在今天已无用。例如,今天你有这样的事情:

if ( !window.requestAnimationFrame ) {
    window.requestAnimationFrame = ( function() {
        return window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.oRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        function(callback,element) {
            window.setTimeout( callback, 1000 / 60 );
        };
} )();
}

执行完全相同的操作,仅适用于较新的 API。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2011-09-09
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2010-11-18
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多