比更改classNames的开关更好的解决方案
better solution than a switch for change classNames
我创建了一个时钟,它连接到date().getHours/minutes/Seconds显示的图像嵌入在不同的类中。
现在,当我想更改图像时,我每秒钟写一个开关。。这可能比谷歌引擎更多的代码。所以我想知道是否有更简单的解决方案。
这是小时开关的一些代码因此,当第15分钟到达时钟时,它将className更改为1和5。
switch(h){
case 15:
x = hours.appendChild(hour1).className = "clock-digit-one";
x = hours.appendChild(hour2).className = "clock-digit-five";
break
case 16:
x = hours.appendChild(hour1).className = "clock-digit-one";
x = hours.appendChild(hour2).className = "clock-digit-six";
break
default:
x = hours.appendChild(hour1).className = "clock-digit-zero";
x = hours.appendChild(hour2).className = "clock-digit-zero";
}
我创建了一个显示更多代码的jsFiddle。任何提示都很好。http://jsfiddle.net/Xk49c/2/
感谢
创建一个人类可读数字数组:
var digits = ["zero", "one", "two", ..., "nine"];
将h
分解为第一位和第二位:
var hours = Math.floor(h / 10);
var minutes = h % 10;
索引到digits
以确定您应该使用的类名:
hours.appendChild(hour1).className = "clock-digit-" + digits[hours];
hours.appendChild(hour2).className = "clock-digit-" + digits[minutes];
当然还有一个更简单的解决方案。例如,您可以制作clock-digit-[number]
之类的类名,然后使用字符串连接来制作className:
x = hours.appendChild(hour1).className = "clock-digit-"+h;
要找出时间数字由哪些数字组成,可以将数字转换为字符串并.split()
。这不是最有效的方法,但它简单明了。
var numbers = h.toString().split(""); //Will give ["1","5"] for 15
然后使用for
循环向div添加数字:
for(var i=0; i<numbers.length; i++) { //We loop through ["1","5"]
var num = document.createElement("div"); //Use your element type here!
num.className = "clock-digit-"+numbers[i]; //Get either 1 or 5
hours.appendChild(num);
}
如果你想使用原始类名,你可以创建一个数组,比如@Jon提议的:
var digits = ["zero", "one", "two", ..., "nine"];
然后,for
循环看起来是这样的:
for(var i=0; i<numbers.length; i++) { //We loop through ["1","5"]
var num = document.createElement("div"); //Use your element type here!
num.className = "clock-digit-"+digits[numbers[i]]; //Get either 1 or 5
hours.appendChild(num);
}
只是扩展我的初始注释
var digits = new Array("zero","one","two","three","four","five","six","seven","eight","nine");
var h=new Date().getHours().toString();
var m = new Date().getMinutes().toString();
var s = new Date().getSeconds().toString();
var t = ((h>9?h:"0"+h)+ (m>9?m:"0"+m) +(s>9?s:"0"+s));
hours.appendChild(hour1).className = "clock-digit-" + digits[t.substring(0,0+1)];
hours.appendChild(hour2).className = "clock-digit-" + digits[t.substring(1,1+1)];
minutes.appendChild(minute1).className = "clock-digit-" + digits[t.substring(2,2+1)];
minutes.appendChild(minute2).className = "clock-digit-" + digits[t.substring(3,3+1)];
seconds.appendChild(second1).className = "clock-digit-" + digits[t.substring(4,4+1)];
seconds.appendChild(second2).className = "clock-digit-" + digits[t.substring(5,5+1)];
我建议一种解决方案,将数字的关联数组保留到它们的关联类。然后你只需要两行就可以设置每个数字(而不是两个数字的单个组合)
大致如下:
var digitToClass = {
0: 'clock-digit-zero',
1: 'clock-digit-one',
2: 'clock-digit-two',
3: 'clock-digit-three'
//..
};
var minute = "03";
minutes1.className = digitToClass[minute[0]];
minutes2.className = digitToClass[minute[1]];
创建一个类名数组并引用其索引(60项),这比开关更好。
编辑:其他人已经发布了示例和更好的解决方案,但逻辑是数组是最好的解决方案。
相关文章:
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- iPad虚拟键盘-哪一个-javasctript解决方案
- AJAX HTTP基本身份验证解决方案
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- Chart.js-添加渐变而不是纯色-实现解决方案
- learnyounode杂耍异步解决方案不工作
- 了解因子分解解决方案
- 提交表单后的最佳解决方案
- 计时器在使用 jQuery 一分钟后没有触发,或者每 1 分钟后给出一些其他解决方案来触发功能
- chrome中的意外全局变量有解决方案吗
- 更好的解决方案HTML元素幻灯片从右侧CSS转换
- 使用SeleniumWebdriver将文本复制到文件时出现编译错误的解决方案
- 如何让我的网站上的WEBP图像加载在morzilla firefox中有一个可能的解决方案吗?如果是,那么如何
- JS驱动的常见问题页面的推荐DB解决方案
- 这里有一个更优雅的/DRY/可维护的JS解决方案
- 什么是农民最实用的解决方案;印刷动物”;
- 根据某些条件验证用户输入,而不是将输入输入到数组中,需要最基本的解决方案
- 有没有一种方法可以为querySelectors编写开关语句或其他解决方案
- 比更改classNames的开关更好的解决方案
- 在必要的setTimeout内打破开关情况…需要某种解决方案