jquery检查xml元素是否有子节点?

时间:2010-08-23 17:22:14

标签: jquery xml

我知道如何使用JQuery迭代xml元素的子元素:

$(this).children('tag_name').each(function() {

});

如果元素有子节点,是否有一种方便的方法来简单地测试?像这个错误的代码:

$(this).hasChildren('tag_name') //returns true or false

5 个答案:

答案 0 :(得分:6)

使用此方法:

var hasChildren = $(this).children('tag_name').length > 0;

答案 1 :(得分:1)

$(this).find('tag_name').length > 0在所有后代之间进行搜索 对于直系孩子来说$(this).children('tag_name').length > 0

答案 2 :(得分:0)

你可以做 -

if ( $(this).children('tag_name').size() > 0 )
{
    // do something
}

答案 3 :(得分:0)

  

是否有方便的方法来简单地测试一个元素是否有孩子?

如果没有设置特定的元素名称,这是最直接的方式。

this.childElementCount > 0

答案 4 :(得分:0)

对于那些重视效率的人(应该是我们所有人):

如果您需要做的就是找出您的节点是否有任何子节点(不考虑类型),那么您要做的就是检查

if(this.childElementCount)

类似于Allain Pannetier suggested。这是纯JavaScript,即使在使用jQuery的情况下,也可以并且应该用于此类情况。 (请注意,$()周围没有this

对于需要查看是否存在某些类型的DIRECT或INDIRECT子级的情况,您要做的就是找到至少一个,这种情况下最快,最有效的jQuery方式是:

$('tag:first-of-type', $(this)).length

基本上在$(this)上下文中找到任何第一个tag。 (如果嵌套,则可以返回多个,但速度更快)

对于只需要查找类型直接子代的情况,可以使用:$(this).children('tag:first-of-type').length

以上所有示例将返回0,即false或非零,即true,因此您可以将它们用作true / false语句,而无需与0或> 0进行比较。

甚至更快:如果您的this节点具有唯一ID(或其他标识符,请相应调整),则提供纯CSS选择器以使用优化的本机搜索,例如:

$( '#'+this.id+' > tag:first-of-type' ).length仅适用于后代

$( '#'+this.id+' tag:first-of-type' ).length(直接/间接)

如果可以避免的话,请勿执行$(this).children('tag').length$(this).find('tag').length之类的操作

在适当的地方使用:first-of-type

这样做的原因是jQuery创建children()集合的开销,在该集合中,每个子对象都将作为其自己的jQuery对象呈现。如果父节点中有很多子节点,那么这将是巨大且不必要的开销。您所做的所有工作仅是为了计算该集合中有多少成员。然后它将一直驻留在内存中,直到收集垃圾为止。通常,您不必担心内存(尽管应该在繁忙的应用程序中),但是要避免为生成的jQuery对象创建子对象的过程是您要避免的开销。仅当您打算使用该集合的子代时才这样做,这意味着-将其分配给要重用的变量。

node.hasChildNodes()具有完整的浏览器支持,但是如果存在空格或文本,则失败,因此此处不建议这样做。 node.childElementCount拥有全面的支持,除了边缘情况外,这几乎是您不必担心的事情,但是请参阅caniuse

上的说明