应该 hasClass 在 removeClass 之前 - 纯 Javascript

Posted

技术标签:

【中文标题】应该 hasClass 在 removeClass 之前 - 纯 Javascript【英文标题】:Should hasClass precede removeClass - pure Javascript 【发布时间】:2014-02-26 15:00:29 【问题描述】:

要删除类,我使用

getElementsByClassName("myclass1")[i].classList.remove("myclass2")

基于 html5 技术。 (我知道这不适用于 IE9-,仅适用于浏览器)。

据我所知,不检查类是否存在绝对没问题。对吧?

但是,就我而言,在我想要删除 myclass2 的页面上有许多带有 myclass1 的项目,但其中大多数(假设 90%)没有 myclass2

检查类myclass2 是否存在将有助于提高性能,因为检查是否存在可能比删除快得多? (仍然不确定我最后的陈述)

在我的情况下你会怎么做?

谢谢。

【问题讨论】:

您应该问自己一个问题:代码现在的工作方式(无论是否存在类都尝试删除)是性能瓶颈吗?如果不是,那么这可能是 premature optimization 的情况(那里有两个有用的链接)。 classList.remove("myclass2") 还需要在删除它之前检查它是否存在(无论如何它都需要找到它)。实际上,如果您自己检查它是否存在并且确实存在,那么调用 .remove("myclass2") 它将再次检查。因此,添加该检查实际上可能会更慢:) @Daniël Knippers 是的,但如果页面上有很多 myclass2 的话。但是,在我的情况下,大约 90% 没有它,但我必须通过所有元素来检查和删除它们。所以这不会太慢,但我可以通过检查是否存在来赢得更多。 可能我理解的不正确。但我得到的是你有一组元素,有类myclass1(可能还有myclass2)。您想从这些元素中删除 myclass2。您询问在调用.remove("myclass2") 之前首先检查每个元素是否有myclass2 是否更快。我回答说.remove("myclass2") 已经包含该检查,所以它可能只是更慢:) 让我问一下,你想在哪里/如何“检查 myclass2 是否存在”? @Haradzieniec 如果您的性能担忧是大量的myclass1 元素可能有也可能没有myclass2,那么您可以选择任何带有myclass2 的元素并过滤那些也有@ 的元素987654337@?如果您知道 myclass2 在较少的元素上,这可能会更高效,而不管这些元素上是否存在 myclass1。但是,您确实应该进行一些测试(如果您还没有),看看当前的方式是否适合您的使用,因为这可能都是白费力气。 【参考方案1】:

据我所知,不检查类是否存在绝对没问题。对吧?

是的。 remove 只会删除它找到的令牌。

检查类 myclass2 是否存在将有助于提高性能,因为检查是否存在可能比删除快得多?

几乎没有,因为它会在列表中被搜索两次。

【讨论】:

【参考方案2】:

getElementsByClassName 支持多个类,所以如果你想简化它,你可以同时包含“myclass1”和“myclass2”作为参数,它只会返回那些同时拥有这两者的元素(更多信息请参见此处:@ 987654321@).

所以,在你的情况下,我建议使用这个:

getElementsByClassName("myclass1 myclass2")[i].classList.remove("myclass2")

【讨论】:

谢谢,但在我的情况下,这不是一个解决方案,因为我需要为所有具有 myclass1 的项目删除 myclass2 并且每个第 n 个 myclass1 都需要 myclass2 并进行一些计算。无论如何,谢谢您的回答,因为这绝对是其他任何人的选择,这是有道理的。

以上是关于应该 hasClass 在 removeClass 之前 - 纯 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

javascript addClass removeClass hasClass #js

JavaScript addClass,removeClass,hasClass

hasClass addClass removeClass

原生javascript实现 hasClass addClass removeClass

原生JS实现hasClass,addClass,removeClass

JQuery属性操作 addclass removeclass hasclass toggleClass()