- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题的答案 ( addClass to an element with that class already? ) 表明在使用 jQuery 时,如果您 .addClass('foo')
已经具有类 的元素,则不会出现问题foo
.
我很好奇 .add
的 element.classList
方法也是如此。
特别是我有一个名为 update()
的函数,每当更新范围 slider 时都会调用该函数。这可能每秒发生多次。根据传递给 update()
的值,我向元素添加和删除某些类。
如果该值连续落在某个范围内,我最终会一遍又一遍地添加相同的类。
我的问题是,我能否允许 elem.classList.add('foo')
在一秒内运行 50 次而不会对用户体验、内存、处理器使用产生任何负面影响等。这是一种可接受的做法吗?
谢谢。
最佳答案
if (!el.classList.contains("foo")) {
el.classList.add("foo");
}
el.classList.add("foo");
.classList
属性是一个 DOMTokenList对象。DOMTokenList
的 DOM 规范将其定义为包含区分大小写、空白 trim 、唯一项的容器。DOMTokenList
的方法(例如DOMTokenList.add()
)都会自动 trim 任何周围的空白并从集合中删除重复项。add()
相同的类名两次,它不会添加重复项。这是一个例子:
<span class=" d d e f"></span>
// Output: DOMTokenList(3) ["d", "e", "f", value: " d d e f"]
// As you can see, it only contains the unique values.
console.log(document.querySelector("span").classList);
// Try to add a duplicate value.
document.querySelector("span").classList.add("e");
// Output: DOMTokenList(3) ["d", "e", "f", value: "d e f"]
// As you can see again, it only contains the unique values.
console.log(document.querySelector("span").classList);
// In fact, the act of duplicates being detected while trying
// to add more classes, results in the "class" attribute itself
// being cleaned up and trimmed:
// Output: "d e f"
console.log(document.querySelector("span").getAttribute("class"));
好吧,那么为什么不应该使用 .contains()
来“避免在不必要时调用 .add()
”?因为:
.contains()
函数和.add()
函数使用完全相同的 native 代码来搜索唯一集以查看它是否包含类。 .add()
将搜索整个集合,如果它已经包含类名,则函数简单地中止。是的,它有时还会在必要时清理“class”HTML 属性,但只有在必要时才这样做。.add()
之前调用 .contains()
并且最终添加了类名,那么您只是运行了对类名的搜索两次,通过两个不同的功能。if (!el.classList.contains("foo")) { ... }
样板,您的代码变得笨拙且不可读类。.add()
添加一个类(即使它已经存在),并且.remove()
删除一个类(即使它已经丢失)。不要将键盘的生命和程序员的眼睛浪费在笨重的样板文件上。仅当您真正关心确定元素是否具有特定类时才使用 .contains()
。 😊
DOMTokenList
还有许多其他有用的功能:.replace(oldToken, newToken)
:用新 token 替换现有 token 。如果旧 token 不存在,.replace()
会立即返回 false
,而不会将新 token 添加到 token 列表中。.toggle(token [, force])
:从列表中删除给定的标记并返回 false
,或者如果标记不存在则添加它,并且函数返回 true
。或者,如果您包含 force
参数:如果包含,则将切换变为单向操作。如果设置为false
,那么token只会被移除,不会被添加。如果设置为true
,那么token只会被添加,不会被移除。关于javascript - 使用 .classList 向已经具有该类的元素添加类是否有任何危害,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51214589/
我不明白为什么我使用的 classList.toggle 的行为类似于 classList.add。当我单击具有下拉菜单的列表项时,它只会在第一次单击时进行更改,而在第二次单击时不会进行任何更改。 v
我有一个元素列表 (ul, li),其中一个类在您单击该元素时设置左边框和粗体突出显示。 当您单击列表中的不同项时,我想将样式重置为原始项,使其恢复正常,然后在刚刚单击的事件项上设置新样式。 奇怪的是
正如标题所说。我似乎看不出两者之间的区别,也看不出 toggle 的第二个参数有什么意义。 谁能给我解释一下? 最佳答案 没有区别; toggle 的第二个参数是为了让这种事情更方便: if (h
这个问题在这里已经有了答案: How can a read only property(element.classList) can be modified or assigned to some
我有一个“+”按钮,单击该按钮时,会触发创建一个带有输入和 2 个按钮的 block ,一个用于验证输入,一个用于删除输入。 //我的代码看起来几乎像这样: addBtn.addEventLi
我试图通过创建具有 3 个执行上下文的堆栈来制作执行堆栈如何在 Javascript 上工作的原理图。全局、执行 A 和执行 B。为此,我构建了一组嵌套的 div 并添加了一个 displayNone
我正在努力提高我的 JavaScript 技能,但我无法解决这个问题。我想在 button.terug 时在我的 body 中显示图像被点击。 我尝试使用 classList.toggle()切换类名
这是我使用 .classList.contains() 时遇到的错误 Uncaught TypeError: Cannot read property 'contains' of undefined
我正在尝试使用 js 和 css 创建一个简单的选项卡式功能。单击选项卡按钮时,它应该从控件中删除所有 active 类,然后仅将 active 类添加到所选元素。 但是,当我尝试删除 active
所以这个程序的重点是询问学生他们的名字,他们这学期上了多少门课,然后它要求每门课的名字。我的问题是我无法让 classList 数组工作并在程序输出中将类名显示给用户。我已经标记了我认为问题的来源,我
我正在尝试做一个简单的 slider ,但我遇到了这个问题: Uncaught TypeError: Cannot read property 'classList' of undefined 这是我
我试图根据变量是否等于 0 添加和删除一个类。这是我的代码: import { LitElement, html } from 'lit-element'; class SelectCounter e
下面是通过 DOM 获取一些元素的代码片段。我只是附加一个简单的 onclick,它应该将“隐藏”属性添加到每个检索到的元素的 classList 中。 HTML: Explorin
我正在尝试创建一个循环,每次执行时都会更改元素的类 HTML Random JS const all_buttons = document.getElementsByTagName('button
我尝试使用 classList.contains 搜索特定类的 DOM 元素,但出现此错误: "TypeError: Cannot read property 'contains' of undefi
我尝试使用 classList.remove 显示测验结果,但这不起作用。 这是我的 HTML。结果位于一个 div 内,该 div 内还有 5 个具有类的其他 div。这个想法是,当提交答案时,其中
我想在调整浏览器大小时删除特定屏幕尺寸上的单击事件监听器。 问题是下面的代码在我刷新页面并且期望的结果就在那里的情况下工作。然而,在调整浏览器大小时,它会保持在低于所需宽度时可点击或超过所需宽度时不可
我试图让扩展面板仅在点击箭头时展开,但是当我尝试编译它时,此功能 private _isExpansionIndicator(target: EventTarget): boolean { c
我有一个像这样的元素: 我想删除所有以“bg-color-”开头的类,所以我只需循环遍历所有类,然后删除匹配的类: var element = document.getElement......;
我在使用 classList.toggle 和 Font Awesome 图标时遇到了一个非常令人困惑的问题。我希望我的汉堡菜单在单击时更改为 X,并且我正在尝试使用 JavaScript 函数来完成
我是一名优秀的程序员,十分优秀!