javascript - 为对象分配/取消分配类

标签 javascript html css dom

我正在尝试为某些对象分配/取消分配类,然后设置某些 CSS 样式,例如事件链接的类,这会将它们的字体样式设置为“斜体”。

我围绕该功能包装了一个函数,因此我可以在具有每个类名的每个对象上调用它。该函数检查类名是否已存在于类属性中。如果不是这样,它会附加类名。

以下是一个“输入”,如果父 div 悬停,则应将颜色从灰色(非事件)更改为黑色(事件),触发“overSearch()”。在该函数中,“assignClass()”被调用,越过了“输入”对象和所需的类名。

但是,我收到如下错误:

"Cannot read property 'innerText' of null."

如果我删除“.innerText”,它会说:

"Cannot read property 'indexof' of undefined."

HTML

<input id="searchbar" type="text" placeholder="http://" spellcheck="false"/>

JavaScript

var srchBar = document.getElementById('searchbar');

function assignClass(obj, classStr){
    var cls = obj.getAttribute('class').innerText;
    if ( cls.indexof(classStr) == (-1) ) {
        cls += (' ' + classStr);
    }
}

function overSearch(){
    assignClass(srchBar, 'searchActive');
}

CSS

.searchActive {
    color: black !important;
}

我试图解释这些错误是因为“assignClass()”无法读取“class”属性,因为它(最初)为空。
其他错误来源可能是对 DOM 结构的不正确处理。

最佳答案

嗯,那个特定的 DOM 节点没有 class 属性,所以 obj.getAttribute('class') 将返回 null,并且访问其上的属性将抛出。

相反,使用 .className property DOM 元素,它始终存在。几乎所有任务都不需要处理属性节点。

function addClass(el, classStr){
    var cls = el.className
    if (cls.indexof(classStr) == -1)
        el.className = cls + ' ' + classStr;
}

请注意,cls 是一个字符串变量,而不是指向某个属性的指针。您需要显式分配给 DOM,仅更改变量是不够的。

关于javascript - 为对象分配/取消分配类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22411599/

相关文章:

javascript - 在 JSTL 条件标记中使用 'div' 类名或标题

html - 翻转卡问题

html - 如何将div的背景图像高度设置为始终响应并且不提供滚动条?

Javascript:计算转换为UTC的2天之间的时差

javascript - 用于基于浏览器的实时 MMO 的 Firebase

javascript - 取消选中所有复选框后如何清除输入

html - float div 的 CSS 跨浏览器问题

html - 仅在移动设备/小屏幕上显示翻转卡片的背面

html - Bootstrap 面板标题更改高度

JavaScript 或 Java 字符串减法