0

私の関数はIE9、バージョン9の下のすべてのクラックで機能します。

私はこれを使用しXPathて既知のを取得しDOM Elementます;

誰かが私のものを置き換える機能を知っていますか?

function createXPathFromElement(elm) {
    var allNodes = document.getElementsByTagName('*'); 
    for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) 
    {
        if (elm.hasAttribute('id')) { 
            var uniqueIdCount = 0; 
            for (var n=0;n < allNodes.length;n++) { 
                if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++; 
                if (uniqueIdCount > 1) break; 
            }; 
            if ( uniqueIdCount == 1) { 
                segs.unshift('id("' + elm.getAttribute('id') + '")'); 
                return segs.join('/'); 
            } else { 
                segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]'); 
            } 
        } else if (elm.hasAttribute('class')) { 
            segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]'); 
        } else { 
            for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) { 
                if (sib.localName == elm.localName)  i++;
            }; 
            segs.unshift(elm.localName.toLowerCase() + '[' + i + ']'); 
        }; 
    };
    return segs.length ? '/' + segs.join('/') : null; 
}
4

1 に答える 1

1

あなたは解決策のためにこの答えを見るかもしれません。

初期のIEで失敗する理由については、hasAttributeIE8まで導入されませんでした。同じIDを持つ要素が複数あることは無効であるため、DOM全体で重複するID属性をチェックしている理由が正確にはわかりません。しかし、実際のHTMLが常に有効であるとは限らないことを理解しています。if (elm.id && elm.id.length)そうは言っても、id属性の存在を確認するために使用できるはずです。同上class

また、IEの初期バージョンでそのXPathを使用することを期待している場合も、問題が発生します。これは、HTMLドキュメントでサポートされているとは思わないためです。そのための解決策がインターネット上にあると私は信じているので、私はあなた(または他の親切な魂)が発見するためにそれを残しておきます。

于 2012-10-17T14:57:01.083 に答える