为什么在删除之前检查元素/属性?

时间:2014-03-21 16:27:30

标签: javascript methods conditional-statements

Learning Javascript - A Hands-On Guide to the Fundamentals of Modern Javascript使用属性节点一章中,作者Tim Wright在第73页上说:

  

删除属性就像获取属性一样简单。我们只是定位元素节点并使用方法removeAttribute()将其移出。 如果您尝试删除不存在的属性 ,则不会引发任何Javascript异常,但使用我们提到的相同hasAttribute()方法仍然是最好的方法早些时候,如代码清单4.6.4所示

清单4.6.4用于删除我们图像的类值的Javascript

if(document.getElementById("pic").hasAttribute("class")) {
    document.getElementById("pic").removeAttribute("class");
}

如果没有任何方式抛出异常,是不是检查它是否存在冗余?会出现同样的结果。本书所说的是在删除它之前检查参数,可以通过不必要的代码保存浏览器解析,但if(document.getElementById("pic").hasAttribute("class")) {}甚至比document.getElementById("pic").removeAttribute("class");更长!

为什么是最佳做法呢?

3 个答案:

答案 0 :(得分:2)

在我看来,你的假设是完全正确的。我认为"建议"在书中有点灾难性(使用一个戏剧性的术语)。没有听说过#34;最佳实践"在任何地方。在删除/更改属性之前使用element.hasAttribute绝对无法实现,但会降低代码速度。浏览器不会神奇地拥有属性的查找列表,以检查它们在设置或获取属性时未使用的存在。但可能是作者认为的最佳做法 - 用于生成可读可理解的代码。

此外,在我看来,你根本不应该使用setAttribute!仅使用setAttribute,没有内置的标准方法来获取或设置某个属性。这里class有问题,请使用

element.className = 'myclass';

而不是

element.setAttribute('class', 'myclass');

使用此类标准化方法时,浏览器已优化了例程。如果在为元素分配或删除属性时没有使用,那么浏览器必须弄清楚它是什么类型的属性,并且可能在之后触发特殊操作 - 而不是每次都是nessecary。

您可以检查浏览器是否支持这样的特定属性方法

if (typeof window.document.body.className === 'string') {
   //className is supported for node elements
}

这些属性方法中的大多数都像getter和setter。您可以阅读和书写,并且使用它们比其他方法更有效。示例:

element.outerHTML = '';

清理比

更多的记忆
element = null;

它当然不是元素的属性,而是为了说明为什么人们应该更喜欢使用针对元素特定部分的内置方法。

您可以使用许多标准方法element.className来定位特定的标准属性。它们大多被命名为camelcase表示法中的属性名称。仅使用setAttribute 作为您自己的custum属性,例如

element.setAttribute('data-my-custum-attribute', 'hello');

根据HTML5标准,这是完全合法的标记。或者使用它作为后备,如果浏览器doenst支持某种属性方法。对于非常古老的浏览器可能就是这种情况。但即使是IE6也支持className


我会推荐两本书,我认为这对于深入理解javascript非常有价值(并不是说我完全做了,但这些书对我有很大帮助):

Douglas Crockford的

Javascript - the good parts Secrets of the JavaScript Ninja,John Resig(jQuery背后的人)

买书!它们是您桌面上的黄金参考。

答案 1 :(得分:0)

我想到的一件事是removeAttribute可能是一个更重的函数调用关于它所做的操作,即它修改了DOM和HTML,并且还可能影响元数据中的元数据。浏览器。

相比之下,hasAttribute只是一个读操作,它更轻,不会对元数据产生影响。因此,最好检查元素是否具有该属性。

如果removeAttribute本身已经进行了hasAttribute检查,那么我同意它几乎是多余的。

答案 2 :(得分:-2)

当你编写一个大型程序或在一个组中工作时,它很有用....你需要检查一下你不会删除被某些东西/其他人使用的东西。如果有更多的技术答案,希望其他人会提供它。