$('div>:contains("test")')
不是通用解决方案,它仅适用于您的特定示例。它仍然匹配其后代包含文本的任何元素test
,只要其父元素是div
。
事实上,目前没有选择器只选择包含目标文本的文本节点的直接父节点。为此,您必须自己遍历 DOM 树,检查为目标文本找到的每个文本节点,或者编写一个插件来执行相同操作。它会很慢,但不会像现在那样慢:contains
(它不是标准的 CSS 选择器,因此您无法获得浏览器原生的快速选择器支持)。
这是一个简单的 DOM 函数,您可以将其用作起点。在相邻(非规范化)文本节点中查找文本或将其隐藏在插件/选择器扩展中可能会得到改进。
function findElementsDirectlyContainingText(ancestor, text) {
var elements= [];
walk(ancestor);
return elements;
function walk(element) {
var n= element.childNodes.length;
for (var i= 0; i<n; i++) {
var child= element.childNodes[i];
if (child.nodeType===3 && child.data.indexOf(text)!==-1) {
elements.push(element);
break;
}
}
for (var i= 0; i<n; i++) {
var child= element.childNodes[i];
if (child.nodeType===1)
walk(child);
}
}
}