javascript - 使用 document.getElementsByClassName - JavaScript 切换类名

标签 javascript html css

我有一个包含子菜单的左侧边栏菜单,我希望每个菜单项都切换一个类名“事件”,这样子菜单就会打开,我有它的 CSS。

问题是我正在使用 document.getElementsByClassName 来选择和迭代所有菜单项并且只对第一个元素起作用,我一直在搜索它与闭包有关并且我正在尝试不同的解决方案,但它不起作用。

我正在制作这个函数,所以我可以用它来切换另一个 div 的类名,而不是点击的那个,在这种情况下我使用和 ID。

var toggleClassname = function (otherDiv, sameDiv) {
    var divToToggleClass;
//are we going to use ID and toggle the classname of another div ?
    if (sameDiv) {
        divToToggleClass = this;
    } else {
        divToToggleClass = document.getElementById(otherDiv);
    }
    console.log(divToToggleClass);
    var className = divToToggleClass.className + ' ';

    if (~className.indexOf(' active ')) {
        divToToggleClass.className = className.replace(' active ', '');
    } else {
        divToToggleClass.className += ' active';
    }
};
var MenuItemsArray = document.getElementsByClassName("classOfMyMenuItems");

for (var i = 0; i < subMenuItemsArray.length; i++) {
    MenuItemsArray[i].addEventListener('click', function () { toggleClassname(null, true) }, false);
}

我一直在尝试使用 [].forEach.call 或将函数包装在另一个返回函数的函数中,但不起作用。

我在纯 javascript 中执行此操作,不能使用新的 .classList.toggle 我也会使用 attachEvent 来更加向后兼容(旧 IE)。

最佳答案

问题是在您的 toggleClassname() 函数中,this 等于被点击的元素。它实际上是 undefinedwindow,具体取决于您的代码是否在严格模式下运行。

addEventListener() 绑定(bind)的点击处理程序会将 this 设置为被点击的元素,因此在以下匿名函数中:

function () { toggleClassname(null, true) }

...this 的值是有问题的元素。但是随后您调用 toggleClassname() 并且不向其传递对单击元素的引用或设置 its this 值。您可以使用 .call() 显式设置它:

function () { toggleClassname.call(this, null, true) }

进一步阅读:

关于javascript - 使用 document.getElementsByClassName - JavaScript 切换类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44689820/

相关文章:

javascript - 正则表达式中的相互递归

javascript - 为什么我的 "Rock Paper Scissors"程序无法运行并且不断使我的页面崩溃?

php - 使用 PHP 从 mysql 数据生成 HTML 表不起作用

javascript - jQuery:下拉菜单脚本问题

css - 了解内联 block div 及其 "margin"css 属性

javascript - 为什么我们需要在 JavaScript 继承中调用父构造函数

javascript - 照片网格 - 多选/突出显示?切换?

javascript - 在 JavaScript 中对数组使用 Math.max.apply 时遇到问题

html - margin 的主要用途

javascript - 如何读取元素的内联样式?