0

現時点では、次のコードを使用して、選択した要素へのパスを取得しています

if (!(el instanceof Element)) return;
        var path = [];
        while (el.nodeType === Node.ELEMENT_NODE) {
            var selector = el.nodeName.toLowerCase();
            if (el.id) {
                selector += '#' + el.id;
            } else {
                var sib = el, nth = 1;
                while (sib.nodeType === Node.ELEMENT_NODE && (sib = sib.previousSibling) && nth++);
                selector += ":nth-child("+nth+")";
            }
            path.unshift(selector);
            el = el.parentNode;
        }
        return path.join(" > ");

完全なhtmlページのコンテキストで正しいパスを返します。ただし、この関数をページ全体ではなく、html ページの小さな領域のコンテキストで機能させたいと考えています。この関数を機能させるにはどうすればよいでしょうか? div#id 内で言ってみましょう。

4

2 に答える 2

1

ただし、この関数をページ全体ではなく、html ページの小さな領域のコンテキストで機能させたいと考えています。この関数を機能させるにはどうすればよいでしょうか? div#id 内で言ってみましょう。

その特定の要素に到達したら、ツリーをたどるのをやめなければならないように思えます。関数に ID と要素のどちらを渡したかに応じて、次のいずれかを実行できます。

while (el.nodeType === Node.ELEMENT_NODE && (!el.id || el.id !== SOME_ID)) {

また

while (el.nodeType === Node.ELEMENT_NODE && el !== SOME_ELEMENT) {
于 2013-10-23T10:07:03.473 に答える
0

少なくとも DOM API を使用しない限り、できません。

DOM API を使用すると、DOM 全体をトラバースできます。好きなだけ上に行くことができます。への参照があれば、document何をしても自由です。

アクセスを制限する方法は、DOM API のラッパーを作成することです。このラッパーには、新しい DOM ノードの作成、DOM ノードの削除、DOM ノードのプロパティの設定など、必要な機能が含まれます。ただし、DOM ツリーを自由に移動することはできません (これにより、必要なカプセル化が壊れるためです)。

このようなラッパーの詳細は非常に複雑で、多くの選択肢があります。これをウィジェットの表記法と組み合わせた社内開発のフレームワークを使用していますが、これは非常に優れています。

于 2013-10-23T09:39:58.893 に答える