搜索具有特定属性集的非嵌套节点

Search for non-nested nodes with specific attribute set

本文关键字:嵌套 节点 属性 搜索      更新时间:2023-09-26

简而言之,我正在用javascript开发一个小库,它将取代<div src="somesite"><div>,其中包含来自指定源的内容。这将允许程序员创建动态页面,而不必在服务器端做更多的工作,而不需要使用iframe。

我需要的是一种有效的方法来获得具有src属性的分支中最顶端的div节点。E.G:

<div src="somesite/pagelet.htm" id="div1">
    <div src="somesite/fallback.htm" id="div2"></div>
</div>
<div src="somesite/pagelet2.htm" id="div3"></div>

我想检索#div1和#div3,稍后再忽略#div2。目前我正在使用以下功能,但我想知道是否有更有效的方法:

function getRootElementsByAttribute(rootEle, tag, attr) {
    try {
        tag = tag.toLowerCase();
        if (rootEle.tagName.toLowerCase() === tag && rootEle.hasAttribute(attr)) {
            return [rooEle]
        }
        var eles = rootEle.getElementsByTagName(tag),
            nodes = [], ele, isRoot, eleParent, a;
        for (a=0; a<eles.length; a++) {
            ele = eles[a];
            if (ele.hasAttrinute(attr)) {
                isRoot = true;
                eleParent = ele;
                while ((eleParent = eleParent.parentNode)) {
                    if (eleParent.tagName.toLowerCase() === 'div' && eleParent.hasAttribute(attr)) {
                        isRoot = false;
                        break;
                    }
                }
                if (isRoot == true) nodes.push(ele)
            }
        }
    }catch(e){}
    return nodes;
}

请不要回答建议使用图书馆的问题。导入一个完整的库似乎有些过头了,因为它只用于这个单一的函数

您可以尝试使用XPath表达式来获取具有属性源的所有根div,方法如下XPath表达式:

/div[@src]

/div选择根级别上的所有div。对于文档中的所有div,请使用//div。[@src]指定只需要具有"src"属性的节点。

var xmlDoc = //load your document here
var xpath  = "/div[@src]"
var nodes  = xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE,null);