jquery - 为什么 :contains(text) 选择所有标签?
问题描述
解决方案
问题是因为您使用的:contains
选择器没有元素上下文,因此 jQuery 会查看每个元素并检查它是否与:contains
选择器匹配。
反过来,更高级别的元素,例如body
,将与此匹配,因此然后将类应用于body
并且所有子元素的文本颜色都会受到影响。
要解决此问题,请使:contains
选择器更具体,例如a:contains
:
$("a:contains('Canon'), a:contains('Nikon')").addClass("promoted");
$(function() {
$(".showMore > a").click(function() {
$(this).text("not all brand").css("background-color", "yellow");
$("a:contains('Canon'), a:contains('Nikon')").addClass("promoted");
});
});
var $elementDom = $("<div></div>");
$elementDom.text("createdDivElement");
$("body").append($elementDom);
var $textDom = $("<div>This is a text div</div>");
$("body").append($textDom);
var $attrDom = $("<div id='attr'>This is a attr div</div>");
$("body").append($attrDom);
#toggle li {
display: inline-block;
}
a {
text-decoration: none;
color: #333;
}
.showMore {
text-align: center;
}
.showMore a {
border: 1px solid #333;
padding: 5px;
}
.promoted {
color: greenyellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="toggle">
<li><a href="#">Canon</a><i>(30440) </i></li>
<li><a href="#">Sony</a><i>(30440) </i></li>
<li><a href="#">samsung</a><i>(30440) </i></li>
<li><a href="#">Nikon</a><i>(30440) </i></li>
<li><a href="#">Panasonnic</a><i>(30440) </i></li>
<li><a href="#">other Brand</a><i>(30440) </i></li>
</ul>
<div class="showMore">
<a href="#"><span>show all brand</span></a>
</div>
编辑- 或按照您的评论建议将类放在上面li
也可以正常工作,您只需稍微修改 CSS rue 以使其具有足够的优先级来覆盖默认a
样式:
$(function() {
$(".showMore > a").click(function() {
$(this).text("not all brand").css("background-color", "yellow");
$("li:contains('Canon'), li:contains('Nikon')").addClass("promoted");
});
});
var $elementDom = $("<div></div>");
$elementDom.text("createdDivElement");
$("body").append($elementDom);
var $textDom = $("<div>This is a text div</div>");
$("body").append($textDom);
var $attrDom = $("<div id='attr'>This is a attr div</div>");
$("body").append($attrDom);
#toggle li {
display: inline-block;
}
a {
text-decoration: none;
color: #333;
}
.showMore {
text-align: center;
}
.showMore a {
border: 1px solid #333;
padding: 5px;
}
.promoted,
li.promoted a {
color: greenyellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="toggle">
<li><a href="#">Canon</a><i>(30440) </i></li>
<li><a href="#">Sony</a><i>(30440) </i></li>
<li><a href="#">samsung</a><i>(30440) </i></li>
<li><a href="#">Nikon</a><i>(30440) </i></li>
<li><a href="#">Panasonnic</a><i>(30440) </i></li>
<li><a href="#">other Brand</a><i>(30440) </i></li>
</ul>
<div class="showMore">
<a href="#"><span>show all brand</span></a>
</div>
推荐阅读
- javascript - 为什么这个正则表达式只适用于字符串结束符号?
- c++ - 计算文件中的矩形数
- reactjs - 在非反应组件中访问上下文
- javascript - 先按数字排序数组,然后按字母排序
- html - Asp 的文本:按钮不可见
- python-3.x - 赋值前引用的局部变量(列表)
- git - 你可以使用 LFS 克隆一个作为 git 存储库克隆的存储库吗?
- sql-server - SQL Server 导入大型数据集并将第二个数据文件添加到 DB 文件组时,加载性能变得很慢
- javascript - React - localstorage 如何添加多种颜色主题
- mysql - SQL 从 FIRST_TABLE 中选择所有未显示在 SECOND_TABLE 上的行