将 class 添加到没有其他特定 class 的匹配元素
Add class to matching element without other specific class
每当用户点击 body
时,我想向某个元素添加 class,只要该元素没有特定的 class。问题是,我重新使用了这个元素,其中一些元素将具有我提到的特定 class,而其他元素则没有。如果一个元素有这个 class,使用我当前的代码,没有元素会添加新的 class。
Here is a fiddle showing the behaviour.
示例:
$('body').on('click', function(){
if ($('.box').hasClass('red') && !$('.box').hasClass('stay-red')) {
$('.box').addClass('blue');
}
});
html, body {
background: lightblue;
height: 100%;
}
.box {
height: 20px;
width: 20px;
margin-bottom: 10px;
}
.red {
background: red;
}
.blue {
background: blue;
}
<div class="box red stay-red"></div>
<div class="box red"></div>
$('.box.red:not(.stay-red)').addClass('blue');
这是你想要的吗?
:not() Selector https://api.jquery.com/not-selector/
使用 filter
会容易很多,并且会避免您的问题:
$('body').on('click', function(){
$('.box').filter('.red:not(.stay-red)').addClass('blue');
});
html, body {
background: lightblue;
height: 100%;
}
.box {
height: 20px;
width: 20px;
margin-bottom: 10px;
}
.red {
background: red;
}
.blue {
background: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<body>
<div class="box red stay-red"></div>
<div class="box red"></div>
</body>
</html>
您可以使用:
$('body').on('click', function(){
$('.box.red:not(.stay-red)').addClass('blue');
});
或者循环遍历所有这些:
$('body').on('click', function(){
$('.box').each(function() {
if ($(this).hasClass('red') && !$(this).hasClass('stay-red')) {
$(this).addClass('blue');
}
});
});
$(function(){
$('body').on('click', function(){
$('.box').each(function(){
if ($(this).hasClass('red') && !$(this).hasClass('stay-red')) {
$(this).addClass('blue');
}
})
});
})
html, body {
background: lightblue;
height: 100%;
}
.box {
height: 20px;
width: 20px;
margin-bottom: 10px;
}
.red {
background: red;
}
.blue {
background: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<body>
<div class="box red stay-red"></div>
<div class="box red"></div>
</body>
</html>
如果你想避免将新的 class 添加到所有元素,如果其中一个元素有另一个 class,你可以使用 some
(or every
):
var els = document.getElementsByClassName('box');
if(![].some.call(els, function(el) {
return el.classList.contains('stay-red');
}) [].forEach.call(els, function(el) {
return el.classList.add('blue');
});
这是您需要的点击正文:
$('body').on('click', function(){
$('.box.red:not(.stay-red)').removeClass('red').addClass('blue');
});
您还需要删除 class .red,即使在这种情况下它仍然有效,因为 class .blue 是在 class .red 之后定义的 CSS
每当用户点击 body
时,我想向某个元素添加 class,只要该元素没有特定的 class。问题是,我重新使用了这个元素,其中一些元素将具有我提到的特定 class,而其他元素则没有。如果一个元素有这个 class,使用我当前的代码,没有元素会添加新的 class。
Here is a fiddle showing the behaviour.
示例:
$('body').on('click', function(){
if ($('.box').hasClass('red') && !$('.box').hasClass('stay-red')) {
$('.box').addClass('blue');
}
});
html, body {
background: lightblue;
height: 100%;
}
.box {
height: 20px;
width: 20px;
margin-bottom: 10px;
}
.red {
background: red;
}
.blue {
background: blue;
}
<div class="box red stay-red"></div>
<div class="box red"></div>
$('.box.red:not(.stay-red)').addClass('blue');
这是你想要的吗?
:not() Selector https://api.jquery.com/not-selector/
使用 filter
会容易很多,并且会避免您的问题:
$('body').on('click', function(){
$('.box').filter('.red:not(.stay-red)').addClass('blue');
});
html, body {
background: lightblue;
height: 100%;
}
.box {
height: 20px;
width: 20px;
margin-bottom: 10px;
}
.red {
background: red;
}
.blue {
background: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<body>
<div class="box red stay-red"></div>
<div class="box red"></div>
</body>
</html>
您可以使用:
$('body').on('click', function(){
$('.box.red:not(.stay-red)').addClass('blue');
});
或者循环遍历所有这些:
$('body').on('click', function(){
$('.box').each(function() {
if ($(this).hasClass('red') && !$(this).hasClass('stay-red')) {
$(this).addClass('blue');
}
});
});
$(function(){
$('body').on('click', function(){
$('.box').each(function(){
if ($(this).hasClass('red') && !$(this).hasClass('stay-red')) {
$(this).addClass('blue');
}
})
});
})
html, body {
background: lightblue;
height: 100%;
}
.box {
height: 20px;
width: 20px;
margin-bottom: 10px;
}
.red {
background: red;
}
.blue {
background: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<body>
<div class="box red stay-red"></div>
<div class="box red"></div>
</body>
</html>
如果你想避免将新的 class 添加到所有元素,如果其中一个元素有另一个 class,你可以使用 some
(or every
):
var els = document.getElementsByClassName('box');
if(![].some.call(els, function(el) {
return el.classList.contains('stay-red');
}) [].forEach.call(els, function(el) {
return el.classList.add('blue');
});
这是您需要的点击正文:
$('body').on('click', function(){
$('.box.red:not(.stay-red)').removeClass('red').addClass('blue');
});
您还需要删除 class .red,即使在这种情况下它仍然有效,因为 class .blue 是在 class .red 之后定义的 CSS