有没有更好的方法来循环通过一系列的类点击比这个javascript
Is there a better way to cycle through a series of classes on click than this javascript
我为自己设置了一个小项目,使用纯javascript而不是简单地诉诸jquery。在这个尝试中,我的目标是点击一个元素,当我点击它时,它会改变颜色或其他什么,当我再次点击另一个元素时,它会改变另一种颜色,以此类推,直到我到达我选择的终点,在这一点上我们重新开始。为了做到这一点,我添加和删除类。
// hasClass
function hasClass(elem, className) {
return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' ');
}
// addClass
function addClass(elem, className) {
if (!hasClass(elem, className)) {
elem.className += ' ' + className;
}
}
// removeClass
function removeClass(elem, className) {
var newClass = ' ' + elem.className.replace( /['t'r'n]/g, ' ') + ' ';
if (hasClass(elem, className)) {
while (newClass.indexOf(' ' + className + ' ') >= 0 ) {
newClass = newClass.replace(' ' + className + ' ', ' ');
}
elem.className = newClass.replace(/^'s+|'s+$/g, '');
}
}
document.getElementById('plug1').onclick = function() {
if (hasClass(document.getElementById('plug1'), 'old')) {
addClass(this, 'red');
removeClass(this, 'old');
}
else if (hasClass(document.getElementById('plug1'), 'red')) {
addClass(this, 'green');
removeClass(this, 'red');
}
else if (hasClass(document.getElementById('plug1'), 'green')) {
addClass(this, 'blue');
removeClass(this, 'green');
}
else if (hasClass(document.getElementById('plug1'), 'blue')) {
addClass(this, 'red');
removeClass(this, 'blue');
}
}
已经成功地拼凑了上面的代码从各种谷歌搜索,我想知道是否有一个更有效的方法来做到这一点,因为它似乎有点冗长?
感兴趣的人可以在这里找到jsFiddle。
也是作为我的问题的第二部分,我最初试图使用。getElementsByClassName的意图是在几个元素上具有相同的功能,但是当我用getElementsByClassName代替getElementById时,它失败了。那么我如何将相同的应用于类而不是Id呢?
希望这是你想要的。使用classList更容易;)
// Fetch all elements with .plug1 class.
var elems = document.getElementsByClassName('plug1');
// Add Onclick listener to all of them
for(var i = 0; i<elems.length; i++) elems[i].onclick = myFunc;
// Replace Color mapping
var replaceClasses = {
old: 'red',
red: 'green',
green: 'blue',
blue: 'red'
};
function myFunc(event){
// Element clicked
var elem = event.target;
// Their classes
var classes = elem.classList;
// Find which class he has.
var key = Object.keys(replaceClasses).find(function(i){ return classes.contains(i); });
// Remove this class
classes.remove(key);
// Add the new class
classes.add(replaceClasses[key]);
}
.plug1 {
width: 10px;
height: 10px;
border: 1px solid;
}
.old { background-color: grey; }
.red { background-color: red; }
.blue {background-color: blue; }
.green { background-color: green; }
<div class="plug1 old"></div>
<div class="plug1 old"></div>
<div class="plug1 old"></div>
<div class="plug1 old"></div>
相关文章:
- 从Javascript方法返回全局变量
- 简单的JavaScript方法链接
- 如何为javascript方法放入jquery确认对话框
- jquery插件或javascript方法自动调整文本输入(而非文本区域)(固定宽度)可变高度的大小
- 在类外重写Javascript方法,使用默认行为
- 使用 JavaScript 方法滚动
- 如何从窗体调用外部javascript方法
- 使用c#在Web服务器上运行JavaScript方法
- 如何从角度 js 调用 javascript 方法
- 在Node.js中,我在哪里可以看到JavaScript方法的源代码,例如hasOwnProperty
- 简单的javascript方法问题
- iframe未执行Javascript方法(PHP)
- Javascript 方法看不到对象变量
- 从HTML中的另一个文件访问javascript方法
- 如何测试只在闭包范围中可见的javascript方法
- 将php表转换为angularjs javascript方法
- 使用ScriptManager.RegisterStartupScript从代码隐藏调用javascript方法
- 如何从 MVC4 链接调用 Javascript 方法(错误 JavaScript 运行时错误:对象不支持此操作)
- Java eqivalent method of “splice(a,b,..)“在 JavaScript 方法中
- 在客户端 Javascript 方法之后运行服务器方法