0

短い間、私はjavascriptの小さなライブラリに取り組んでおり、<div src = "somesite"></div>を指定されたソースのコンテンツに置き換えます。これにより、コーダーは、iframeを使用する煩わしさなしに、サーバー側でより多くの作業を行うことなく、動的なページを作成できます。

私が必要としているのは、src属性を持つブランチの最上位のdivノードを取得するための効率的な方法です。例えば:

<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;
}

ライブラリの使用を示唆する回答はありません。ライブラリ全体をインポートするのは、この単一の関数だけに使用される場合はやり過ぎのようです。

4

1 に答える 1

0

XPath 式を使用して、次の XPath 式のようなものを使用して、属性 source を持つすべてのルート div を取得することができます。

/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); 
于 2012-08-18T15:54:52.637 に答える