有人能告诉我是否可以根据内容而不是 id 或类找到元素?
我试图找到没有不同类或id的元素。 (然后我需要找到该元素的父级。)
答案 0 :(得分:384)
您可以使用:contains
选择器根据内容获取元素。
$('div:contains("test")').css('background-color', 'red');
<div>This is a test</div>
<div>Another Div</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
答案 1 :(得分:85)
在jQuery文档中,它说:
匹配的文本可以直接显示在所选元素中 任何元素的后代或组合
因此,使用:contains()
选择器是不够的,还需要检查您搜索的文字是否为元素的直接内容你的目标是这样的:
function findElementByText(text) {
var jSpot = $("b:contains(" + text + ")")
.filter(function() { return $(this).children().length === 0;})
.parent(); // because you asked the parent of that element
return jSpot;
}
答案 2 :(得分:20)
var text = "text";
var search = $( "ul li label" ).filter( function ()
{
return $( this ).text().toLowerCase().indexOf( text.toLowerCase() ) >= 0;
}).first(); // Returns the first element that matches the text. You can return the last one with .last()
希望有人在不久的将来发现它有用。
答案 3 :(得分:14)
火箭的答案不起作用。
<div>hhhhhh
<div>This is a test</div>
<div>Another Div</div>
</div>
我只是修改了他的DEMO here,你可以看到根DOM被选中了。
$('div:contains("test"):last').css('background-color', 'red');
在代码中添加“:last ”选择器以解决此问题。
答案 4 :(得分:13)
在我看来最好的方式。
$.fn.findByContentText = function (text) {
return $(this).contents().filter(function () {
return $(this).text().trim() == text.trim();
});
};
答案 5 :(得分:10)
是的,使用jQuery contains
选择器。
答案 6 :(得分:2)
以下jQuery选择包含文本但没有子级的div节点,它们是DOM树的叶节点。
$('div:contains("test"):not(:has(*))').css('background-color', 'red');
<div>div1
<div>This is a test, nested in div1</div>
<div>Nested in div1<div>
</div>
<div>div2 test
<div>This is another test, nested in div2</div>
<div>Nested in div2</div>
</div>
<div>
div3
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
答案 7 :(得分:0)
到目前为止的所有答案都不匹配 all specific 包含 direct 子文本节点的元素,该子文本节点包含 specific 文字。
考虑以下示例。我们要找到所有的霍比特人,即所有包含直接子文本节点的div
,其中包含单词“霍比特人”(包括单词边框,忽略大小写)。
$(function() {
const ELEMTYPE = Node.ELEMENT_NODE
const TEXTTYPE = Node.TEXT_NODE
/*
Behaves a bit like Python's os.walk().
The `topdown` parameter is not strictly necessary for this example.
*/
function* walk_text(root, topdown=true) {
const childs = []
const textchilds = []
for (const child of root.childNodes) {
const childtype = child.nodeType
if (childtype === ELEMTYPE) {
childs.push(child)
} else if (childtype === TEXTTYPE) {
textchilds.push(child)
}
}
if (topdown) {
yield [root, textchilds]
}
for (const child of childs) {
yield* walk_text(child, topdown)
}
if (!topdown) {
yield [root, textchilds]
}
}
function* walk_matching(startnode, nodepat, textpat) {
for ( [elem, textchilds] of walk_text(startnode) ) {
if ( nodepat.test(elem.nodeName) ) {
for ( const textchild of textchilds ) {
if ( textpat.test(textchild.nodeValue) ) {
yield elem
break
}
}
}
}
}
// raw dom node
let startnode = $('body')[0]
// search for element nodes with names matching this pattern ...
let nodepat = /^div$/i
// ... containing direct child text nodes matching this pattern
let textpat = /\bhobbit\b/i
for ( const node of walk_matching( startnode, nodepat, textpat ) ) {
$(node).css({
border: '1px solid black',
color: 'black'
})
}
});
div {
margin:10px 0;
padding: 10px;
border: 1px solid silver;
color: silver;
font-style:italic;
}
div:before {
display:block;
content: attr(name);
font-style:normal;
}
/* Inserted by SO, we are not interested in it */
body + div {
display: none;
}
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Find the hobbits</title>
</head>
<body>
<div name='Tolkien'>
book writer
<div name='Elrond'>
elven king
<div name='Arwen'>elven princess</div>
<div name='Aragorn'>human king, son-in-law</div>
</div>
<div name='Gandalf'>
wizard, expert for hobbits
<div name='Bilbo'>
old hobbit
<div name='Frodo'>
young hobbit
<div name='Samweis'>best friend hobbit</div>
</div>
</div>
<div name='Gollum'>ex hobbit</div>
<div name='Odo'>hobbit</div>
</div>
</div>
<script src= "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</body>
</html>
找到的其他答案(搜索“霍比特人”时):
所有这些答案都有意义,这取决于您想要做什么。明智地选择,因为 Rocket Hazmat 的答案、Morgs 的答案和 Terry Lin 的答案的部分性能比我的解决方案快两倍多。我想这是因为他们不需要遍历整个 DOM。大多数使用 .filter()
的答案执行得非常快。