【问题标题】:JS: Switch/Case to change className not workingJS:切换/案例更改类名不起作用
【发布时间】:2018-07-17 11:59:01
【问题描述】:

所以我正在尝试创建我的第一个开关/案例功能,但我无法弄清楚它为什么不起作用。我添加了一个控制台输出来测试案例是否有效,看起来确实有效,但它从不更新类名:

function menuSwitch() {
    var menu = document.getElementById("sidebar").className;

    switch(menu) {
        case "on":
            menu.className = "off";
            console.log('Classname should now be "off"')
            break;
        case "off":
            menu.className = "on";
            console.log('Classname should now be "on"')
            break;
    }
}

https://jsfiddle.net/o39e05ag/2/

我错过了什么?我也尝试从变量中删除 .className ,但什么也没有。也没有错误。该函数也在我的 js 的最后,以确保没有任何干扰(也没有相同的名称)。

编辑:只是纯 JS。我不是在寻找 jQuery!

编辑 2: 已解决。我需要在 var 之后的 switch 中定义它,而不是 var 中的 .className ,然后在每种情况下都相同。

【问题讨论】:

  • 试试menu.classList.add('on')menu.classList.remove('on')
  • 将此var menu = document.getElementById("sidebar").className 更改为此var menu = document.getElementById("sidebar") 基本上,您正在尝试从字符串访问属性className
  • 您正在向本地字符串添加一个名为 className 的属性。
  • @Ele 这就是我试图开始的。 Slaawwa,所以我写的是menu.classList.remove('on'),而不是console.log('Classname should now be "off"')?试过了,还是没有。我现在看到 JsFiddle 正在抛出一个合适的说法 Uncaught ReferenceError: menuSwitch is not defined at HTMLButtonElement.onclick ((index):81)。这在我的生活环境中不会发生,所以现在 JsFiddle 似乎对测试毫无价值。

标签: javascript function switch-statement


【解决方案1】:

switch() 内部,您没有使用menu 作为Element 的引用。相反,您使用的是className,它基本上是一个字符串。因此您将无法使用menu.className

改变

var menu = document.getElementById("sidebar").className;
switch(menu) {

var menu = document.getElementById("sidebar");
switch(menu.className) {

function menuSwitch() {
  var menu = document.getElementById("sidebar");
  switch(menu.className) {
    case "on":
      menu.className = "off";
      console.log('Classname should now be "off"')
      break;
    case "off":
      menu.className = "on";
      console.log('Classname should now be "on"')
      break;
  }
}
.on{
  display: none;
}
<button onclick="menuSwitch()">Toggle menu</button>
<div id="sidebar" class="on">
Test
</div>

【讨论】:

  • 谢谢,但我对使用 jQuery 还没有兴趣。对我的项目来说似乎有点矫枉过正。
  • @Strechingmycompetence,解决方案纯粹是在 JS 上。我只是错误地添加了 jQuery 引用......现在删除......谢谢......
  • 感谢您的更新。这行得通!我添加了“off”作为默认类名,并为“on”类的左侧属性添加了 0px。我不确定我是否理解这里的原因,但对我来说,它只是在不同的情况下定义的相同。我想我需要进行更多研究。
  • @Strechingmycompetence,不客气......有时我们都处于你现在的情况......这就是为什么我们在这个社区中互相帮助.........快乐的编程:)
【解决方案2】:

问题不在于 switch 语句。 对于现代 HTML5 样式,请使用 classList

试试这个(见 cmets):

function menuSwitch() {
  var menu = document.getElementById("sidebar"); // Get the DOM element
  var className = menu.className; // Get the class

	switch(className) {
		case "on":
			menu.classList.remove('on'); // Remove on
            menu.classList.add('off'); // Add off
			console.log('Classname should now be "off"')
			break;
		case "off":
			menu.classList.remove('off');
      menu.classList.add('on');
			console.log('Classname should now be "on"')
			break;
	}
}
#sidebar {
	position: fixed;
}

.on {
	left: 0px;
}

.off {
	left: -100%;
}
<button onclick="menuSwitch();">Toggle menu</button>
<div id="sidebar" class="on">
Test
</div>

【讨论】:

  • So.. 使用 classlist,您将获得一个可以迭代的数组,因此,它可以在 var 中定义 .className,而不是直接在 switch 语句上以及在示例中的情况下我标记为解决方案?
  • 不,classList返回一个DOMTokenList,不是一个数组,但是类似,有长度,可以迭代。但它没有所有内置的数组方法(如 map、filter 等)。 DOMTokenList 有自己的方法,如添加、删除、切换等...检查这里:developer.mozilla.org/en-US/docs/Web/API/DOMTokenList
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多