【问题标题】:Javascript color change <div> on conditionJavascript颜色更改<div>条件
【发布时间】:2021-03-11 23:13:28
【问题描述】:

所以我有这个代码块,我需要 div 的颜色在紫色和白色之间“闪烁”以用于条件“MECHANIC ON LINE”。我知道在 switch 语句之外我正在实现的代码正常工作,但在 switch 语句中我不确定。这也是在公司服务器上,我不确定后端的某些进程如何处理页面的更新。无论如何,如果有人知道我在 switch 语句中实现我的代码是否不正确,请告诉我。此外,代码的第一个 sn-p 取自下面更大的 sn-p,它是我关心的 switch 语句的一部分。最后,我还想提一下,我已经将时间间隔设置为彼此不同的整数,例如“setInterval(function, 10 * 1000), setInterval(function, 20 * 2000)”。

                    case "MECHANIC ON LINE":
                        colorTitle[i].style.color = 'rgb(127.5, 127.5, 127.5)';
                        if(colorBackground[l].style.background === 'rgb(123,31,162)') {
                            setInterval(colorBackground[l].style.background = 'rgb(255,255,255)',10 * 1000);
                        } else {
                            setInterval(colorBackground[l].style.background = 'rgb(123,31,162)',10 * 1000);
                        }
                    break;
for(var i = 0; i < colorTitle.length; i++) {
            for(var l = i; l < colorBackground.length; l++) {
                switch(colorTitle[i].textContent) {
                    case "RUNNING":
                    colorTitle[i].style.color = 'rgb(0, 255, 0)';
                    colorBackground[l].style.background = 'rgb(0, 255, 0)';
                    break;
                    case "LINE DOWN":
                    colorTitle[i].style.color = 'rgb(255, 0, 0)';
                    colorBackground[l].style.background = 'rgb(255, 0, 0)';
                    break;
                    case "OFFLINE":
                    colorTitle[i].style.color = 'rgb(127.5, 127.5, 127.5)';
                    colorBackground[l].style.background = 'rgb(127.5, 127.5, 127.5)';
                    break;
                    case "MECHANIC ON LINE":
                        colorTitle[i].style.color = 'rgb(127.5, 127.5, 127.5)';
                        if(colorBackground[l].style.background === 'rgb(123,31,162)') {
                            setInterval(colorBackground[l].style.background = 'rgb(255,255,255)',10 * 1000);
                        } else {
                            setInterval(colorBackground[l].style.background = 'rgb(123,31,162)',10 * 1000);
                        }
                    break;
                    default:
                    colorTitle[i].style.color = 'rgb(255, 255, 255)';
                    colorBackground[l].style.background = 'rgb(255, 255, 255)';
                    break;
                }
            }
        }

【问题讨论】:

  • 这听起来更适合基于类的动画而不是手动控制颜色,这可能吗?
  • 我同意,但这需要对许多其他代码进行重组,这可能不是一个选项。另外我认为,即使它是基于类的动画,它仍然可能在 switch 语句中遇到同样的问题。

标签: javascript if-statement switch-statement setinterval


【解决方案1】:

这里的问题是,在两种颜色之间进行选择的逻辑在 switch 语句内部,它只执行一次。所以你正在做的是设置间隔以保持重复设置相同的颜色。

两种颜色的切换逻辑需要在每个重复区间的回调函数内部。像这样的:

case "MECHANIC ON LINE":
  colorTitle[i].style.color = 'rgb(127.5, 127.5, 127.5)';
  colorBackground[l].style.background = 'rgb(255,255,255)';
  setInterval(function() { flicker(colorBackground[l]); }, 10 * 1000);
break;

然后你需要在某处定义函数:

function flicker(target) {
  if(target.style.background === 'rgb(123,31,162)') {
    target.style.background = 'rgb(255,255,255)';
  } else {
    target.style.background = 'rgb(123,31,162)';
  }
}

由于对象和数组是通过引用传递的,因此原始的colorBackground 将被更新,即使看起来您已经创建了一个名为target 的新对象。

【讨论】:

  • 谢谢,我明天试试在服务器上运行这个!我会及时通知你,让你知道这个解决方案是否对我有用。
  • 我收到“无法读取未定义样式”的错误。这只发生在我在我的 Crimson 服务器中运行它时,代码在本地工作以更改颜色,但不会向后和第四次闪烁。
  • 我已经更新了答案 - 我们没有为背景颜色设置初始值(参见第一段代码)。
  • 抱歉,我想尝试在注释中包含代码但不能。我们解决了未定义的问题,但在服务器上,闪烁仍然是一个问题。我将尝试在上面的解决方案中实现一些不同的迭代。如果我成功了,我会告诉你的。
  • 嘿,所以我想让你更新。在服务器上我又遇到了未定义的问题,我相信我知道为什么。因此,在 switch 语句的第一次迭代中,我们定义了变量并被捕获,但除非再次运行 switch 语句,否则我相信它会导致变量在 setInterval 函数内失去作用域。到目前为止,这是我的理论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2015-11-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2010-12-24
  • 2014-09-07
相关资源
最近更新 更多