【发布时间】:2010-11-04 08:49:28
【问题描述】:
我想在一个包含文本字符串的 div 中创建一个包含所有 html 元素的数组,例如
<p>some string</p>.
我不想获取字符串,我希望数组项成为元素(在示例中,将是 p 节点)。我事先不知道字符串是什么,所以我无法查找要匹配的字符串值。我也不希望空文本节点出现在数组中。
谢谢!
【问题讨论】:
我想在一个包含文本字符串的 div 中创建一个包含所有 html 元素的数组,例如
<p>some string</p>.
我不想获取字符串,我希望数组项成为元素(在示例中,将是 p 节点)。我事先不知道字符串是什么,所以我无法查找要匹配的字符串值。我也不希望空文本节点出现在数组中。
谢谢!
【问题讨论】:
$("#my_div *").filter(function()
{
var $this = $(this);
return $this.children().length == 0 && $.trim($this.text()).length > 0;
})
此版本不会返回包含有文本元素的父元素,只返回最后一级元素。
可能不是最快的,但在 StackOverflow 主页上运行良好:)
【讨论】:
自定义选择器可能对您的情况有所帮助:
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
我假设您只是尝试选择其中只有文本的元素。
【讨论】:
你可以使用not和空选择器来获取非空元素,而转换为数组可以使用get来实现
$("#theDiv > :not(:empty)").get();
上述选择器获取“theDiv”的所有非空子元素(即它们有子元素或文本),然后将匹配的集合转换为数组。
如果您只想要其中包含文本的元素,这应该可以...
$("#theDiv > :not(:empty, :has(*))").get();
要去掉有空格的元素,你可以使用过滤器
$("#theDiv > :not(:has(*))").filter(function() {
return $.trim(this.innerHTML).length > 0;
}).get();
【讨论】:
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 是包含一些文本的元素数组。
【讨论】:
$(function() {
var array = new Array();
$("#testDiv *").each(function(x, el) {
if ($.trim($(el).text()) != '' ) {
array.push(el);
}
});
alert(array.length);
});
【讨论】:
d 是您要在其下查找内容的 div
v 是一个空数组
我必须从 0 开始。
使用 $.trim 是为了避免得到只是空白的节点。
$("*",d).filter( function() {
return $.trim($(this).text()) != ""
} ).each( function() {
v[i] = $(this).text();
i++;
} );
也可以使用 v.push($(this))...这让我完全忘记了。
【讨论】:
使用 :contains 选择器:
var matches = new Array();
$('#start_point *:contains(' + text + ')').each(function(i, item) {
matches.push( item );
}
【讨论】: