8

我想在包含文本字符串的 div 中创建一个包含所有 html 元素的数组,例如

<p>some string</p>.  

我不想获取字符串,我希望数组项成为元素(在示例中,将是 p 节点)。我事先不知道字符串是什么,所以我无法查找要匹配的字符串值。我也不希望空文本节点最终出现在数组中。

谢谢!

4

8 回答 8

11
$("#my_div *").filter(function()
{
     var $this = $(this);
     return $this.children().length == 0 && $.trim($this.text()).length > 0;
})

此版本将不返回包含具有文本的元素的父元素,仅返回最后一级元素。

可能不是最快的,但在 StackOverflow 主页上效果很好:)

于 2009-06-19T17:54:37.383 回答
7

在您的情况下,自定义选择器可能会有所帮助:

jQuery.expr[':'].hasText = function(element, index) {
     // if there is only one child, and it is a text node
     if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) {
        return jQuery.trim(element.innerHTML).length > 0;
     }
     return false;
};

之后,您可以简单地执行以下操作:

$('#someDiv :hasText') // will contain all elements with text nodes (jQuery object)
$('#someDiv :hasText').get() // will return a regular array of plain DOM objects

我假设您只是想选择其中只有文本的元素。

于 2009-06-19T17:04:14.077 回答
2

您可以使用 not 和空选择器来获取非空元素,同时可以使用 get 实现转换为数组

$("#theDiv > :not(:empty)").get();

上面的选择器获取“theDiv”的所有不为空的子元素(即它们有子元素或文本),然后将匹配的集合转换为数组。

如果您只想要其中包含文本的元素,这应该可以...

$("#theDiv > :not(:empty, :has(*))").get();

要摆脱有空格的元素,您可以使用过滤器

$("#theDiv > :not(:has(*))").filter(function() { 
                 return $.trim(this.innerHTML).length > 0;
         }).get();
于 2009-06-19T16:55:29.453 回答
1

您可以循环遍历孩子并获取具有.text()值的所有内容!= ""

于 2009-06-19T16:31:29.387 回答
1
var array = [];
var divSelector = "div.mine";

$(divSelector).contents().each(function()
{
   // If not an element, go to next node.
   if (this.nodeType != 1) return true;       

   var element = $(this);
   if ($.trim(element.text()) != "")
     array.push(element);
});

array是其中包含一些文本的元素数组。

于 2009-06-19T16:45:32.787 回答
0

d 是您要在其下查找内容的 div
v 是一个空数组
i 您必须从 0 开始。

使用 $.trim 是为了您不会得到只是空白的节点。

$("*",d).filter( function() { 
     return $.trim($(this).text()) != ""
  } ).each( function() { 
     v[i] = $(this).text(); 
     i++; 
  } );

也可以使用 v.push($(this))... 这完全让我忘记了。

于 2009-06-19T16:40:32.037 回答
0

使用 :contains 选择器:

var matches = new Array();
$('#start_point *:contains(' + text + ')').each(function(i, item) {
 matches.push( item );
}
于 2009-06-19T17:17:23.340 回答
0
 $(function() {
        var array = new Array();
        $("#testDiv *").each(function(x, el) {

            if ($.trim($(el).text()) != '' ) {
                array.push(el);
            }
        });
        alert(array.length);
    });
于 2009-06-19T16:47:10.867 回答