如何获得没有孩子但可能有文字的元素?

Amr*_*rhy 15 html javascript jquery

空选择说:匹配有没有孩子(包括文本节点)的所有元素.
查找所有空的元素 - 它们没有子元素或文本.

我想要的是获得没有孩子但可能里面有文字的元素.怎么样?



更新:
示例:
我想选择这些没有子元素但可能有文本的元素,语法如下:

$('div:empty, a:empty, span, p:empty, td:empty, img, input').mousemove(myMouseOverHandler);
Run Code Online (Sandbox Code Playgroud)

Bor*_*gar 27

获取任何没有任何其他元素的元素:

$('*:not(:has(*))');
Run Code Online (Sandbox Code Playgroud)

  • 可能值得一提的是,这不起作用:"*:has(:not(*))"由于某些内部原因而失败. (3认同)
  • 如果您考虑 CSS 选择器引擎可能如何尝试解释选择器,这是有道理的。`has` 不需要知道如何处理 `not`。更好的是,“not(*)”到底是什么意思?它如何转化为我们想要的?无论如何,这个答案很棒,因为它救了我的命。 (2认同)

Pao*_*ino 19

如果元素只有文本,children()则长度为0:

<div id="test1">
Hello World
</div>

<div id="test2">
<b>Hey there</b>
</div>

<script>
alert($("#test1").children().length); // alerts 0
alert($("#test2").children().length); // alerts 1 (the bold tag)
</script>
Run Code Online (Sandbox Code Playgroud)

编辑:为了响应您的编辑,jQuery非常棒,让您可以自定义过滤器:

$.expr[':'].emptyOrText = function(e) {  
    return $(e).children().length == 0;
};
Run Code Online (Sandbox Code Playgroud)

因此,对上面的HTML使用上面的内容,你可以这样做:

$('div:emptyOrText'); // will select #test1
Run Code Online (Sandbox Code Playgroud)


Set*_*day 6

我为那些不想使用 jQuery 的人制作了一个纯 JavaScript 函数。

const getElementsWithNoChildren = (target) => {
    let candidates;

    if (target && typeof target.querySelectorAll === 'function') {
        candidates = target.querySelectorAll('*');
    }
    else if (target && typeof target.length === 'number') {
        candidates = target;
    }
    else {
        candidates = document.querySelectorAll('*');
    }

    return Array.from(candidates).filter((elem) => {
        return elem.children.length === 0;
    });
};
Run Code Online (Sandbox Code Playgroud)