我如何用纯JavaScript取代jQuery的toggleClass方法
How do I supplant jQuery's toggleClass method with pure JavaScript?
如何将这段jQuery代码转换为JavaScript?
$('#element').click(function(){
$(this).toggleClass('class1 class2')
});
我已经尝试了以下代码,但无济于事。
第一个是:
var element = document.getElementById('element'),
classNum = 0; // Supposing I know that the first time there will be that class
element.onmousedown = function() {
if (classNum === 0) {
this.classList.remove("class1");
this.classList.add("class2");
classNum = 1;
}
else if (classNum === 1) {
this.classList.remove("class2");
this.classList.add("class1");
classNum = 0;
}
}
第二个是:
var element = document.getElementById('element'),
classNum = 0; // Supposing I know that the first time there will be that class
element.onmousedown = function() {
if (classNum === 0) {
this.className -= "class1";
this.classList += "class2";
classNum = 1;
}
else if (classNum === 1) {
this.classList -= "class2";
this.classList += "class1";
classNum = 0;
}
}
任何不建议我坚持使用jQuery的答案将不胜感激。
[编辑]
我已经尝试了您的所有解决方案,但无法正确处理。我相信这是因为我没有清楚地说明该元素有多个类,如下所示:
class="class1 class3 class4"
我想要的基本上是用class2替换class1并在它们之间切换。
更新:作为对评论的回应,classList.toggle 是一个纯粹的 JavaScript 解决方案。正如一条评论所暗示的那样,它与jQuery无关。如果需要支持旧版本的IE,那么下面的MDN链接中有一个填充程序(pollyfill(。如果需要,这个垫片远远优于公认的答案。
使用classList.toggle当然似乎是最简单的解决方案。另请参阅是否可以使用 classList 获得浏览器支持。
element.onclick = function() {
'class1 class2'.split(' ').forEach(function(s) {
element.classList.toggle(s);
});
}
运行代码段以尝试
box.onclick = function() {
'class1 class2'.split(' ').forEach(function(s) {
box.classList.toggle(s);
stdout.innerHTML = box.className;
});
}
/* alternative
box.onclick = function() {
['class1', 'class2'].forEach(function(s) {
box.classList.toggle(s);
stdout.innerHTML = box.className;
});
}
*/
.class1 { background-color: red;}
.class2 { background-color: blue;}
.class3 { width: 100px; height: 100px; border: 1px black solid;}
click me:
<div id="box" class="class1 class3"></div>
<div id="stdout"></div>
classNum
是一个局部变量。
每次调用事件处理程序时,您都会得到一个新变量,该变量与上次调用的值无关。
您希望它是一个全局变量。
或者,更好的是,改为检查classList.contains
。
来自: 你可能不需要 jQuery
$(el).toggleClass(className);
替换为:
if (el.classList) {
el.classList.toggle(className);
} else {
var classes = el.className.split(' ');
var existingIndex = classes.indexOf(className);
if (existingIndex >= 0)
classes.splice(existingIndex, 1);
else
classes.push(className);
el.className = classes.join(' ');
}
然后只需将该函数调用包装在document.getElementById('elementId').click
参见 小提琴:https://jsfiddle.net/2ch8ztdk/
var s = document.getElementById('element');
s.onclick=function(){
if(s.className == "class1"){
s.className = "class2"
} else {
s.className = "class1"
}
}
你的代码很接近,但你的classNum变量不是迭代的。试试这个:
var element = document.getElementById("element");
var numCount = 0;
element.addEventListener('click', function() {
if (numCount === 0) {
this.className = "";
this.className += " class1";
numCount++;
} else {
this.className = "";
this.className += " class2";
numCount = 0;
}
});
.class1 {
color: red;
}
.class2 {
color: blue;
}
<div id="element">click me</div>
使用classList
,但它只支持IE 10+
演示
var eles = document.querySelectorAll('#element');
var classNames = 'one two';
for(var i = 0; i < eles.length; i ++){
eles[i].onclick = function(e){
toggleClass.call(this, classNames);
}
}
function toggleClass(names){
var sp = names.split(' ');
for(var i = 0; i < sp.length; i++){
this.classList.toggle(sp[i]);
}
}
更新了我的答案以支持每个元素的多个类
https://jsfiddle.net/pwyncL8r/2/现在,这将允许元素已经有 n 个类,并且仍然只交换一个类,保留其他类。
.HTML
<div id="div1" style="width: 100px; height: 100px;" class="backBlack left100"</div>
<input type="button" id="swapButton" value="Css Swap" />
.CSS
.backBlack {
background-color: black;
}
.backRed {
background-color: red;
}
.left100 {
margin-left: 100px;
}
.JS
swapButton.onclick = function() {
var curClassIsBlack = (' ' + document.getElementById("div1").className + ' ').indexOf(' backBlack ') > -1
if (curClassIsBlack) {
document.getElementById("div1").className =
document.getElementById("div1").className.replace(/(?:^|'s)backBlack(?!'S)/g, '')
document.getElementById("div1").className += " backRed";
} else {
document.getElementById("div1").className =
document.getElementById("div1").className.replace(/(?:^|'s)backRed(?!'S)/g,'')
document.getElementById("div1").className += " backBlack";
}
}
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- jQuery/Javascript.toggleClass/.classList.toggle的特殊行为
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 我如何用纯JavaScript取代jQuery的toggleClass方法
- jQuery方法未按预期工作-toggleClass
- 如何使用jquery cookie插件保存toggleClass方法的状态
- jQuery UI toggleClass方法不存在选项
- . toggleclass()方法的奇怪行为