javascript - 直接包含文本的元素的 jQuery 选择器?

标签 javascript jquery

我能够使用 :contains 选择器使此部分工作,但我的问题是,如果一个元素包含一个包含它仍然返回的文本的元素。例如:

$('div:contains("test")')

将选择下面的两个 div:

<div>something else
   <div>test</div>
</div>

fiddle :http://jsfiddle.net/TT7dR/

如何只选择“直接”包含文本的 div?这意味着在上面的示例中,只会选择子 div。

更新:

澄清一下,如果我正在搜索文本“其他内容”而不是“测试”,那么我只想找到父 div。

最佳答案

$('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);
        }
    }
}

关于javascript - 直接包含文本的元素的 jQuery 选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896455/

相关文章:

Javascript 显示 "cannot set property ' innerHTML' of null"

javascript - ASP.NET 4.6 WEB API,不提供静态文件(.js、.css) IIS Express Visual Studio

javascript - 忽略其中包含公式的空单元格值

javascript - 从 json 响应创建动态变量

javascript - jQuery 递增和递减按钮将应用的值附加到数字

javascript - 'each' 和 'addClass workaround' 文件加载 jQuery 更快更容易

javascript - 在 Rails 3 Controller 中处理 jsonp

css 的 Javascript href 属性未更新

ajax - GData API和跨域ajax调用

javascript - 使用隐藏输入来 POST JavaScript 函数结果